2012-02-29 8 views
8

En el proyecto, tengo que enviar comandos complejos JSON desde el servidor al cliente. ¿Es efectivo generar JSONObjects (Strings, Numbers, etc.) convertirlos a la cadena y luego enviarlos a través de RequestBuilder o hay un método más eficaz.Cómo generar JSON en el cliente

¿Es eficaz para convertir objetos JSON a cuerda (a través del método .toString en el objeto)

Código ejemplo:

JSONObject retObject = new JSONObject(); 
    retObject.put("NumberVar", new JSONNumber(1)); 
    retObject.put("StringVar", new JSONString("HelloWorld")); 

    JSONArray arrayVar= new JSONArray(); 
    for (int i = 0; i < 5; i++) { 
     arrayVar.set(i, 
       new JSONString("Array")); 
    } 
    retObject.put("EventParameters", arrayVar); 

    System.out.println(retObject.toString()); 

de salida:

{"NumberVar":1, "StringVar":"HelloWorld", "EventParameters":["Array","Array","Array","Array","Array"]} 

Saludos, Stefan

Respuesta

9

La solución que tiene funcionará.

Si desea hacerlo de manera más eficiente, y sólo desea apoyar los navegadores modernos con soporte para JSON.stringify(), se puede trabajar en JavaScriptObjects en lugar de JSONObjects y utilizar este método nativo:

private static native String stringify(JavaScriptObject jso) /*-{ 
    return JSON.stringify(jso); 
}-*/; 

alternativa, puede stringify un JSO haciendo:

String json = new JSONObject(jso).toString(); 

JavaScriptObject s son más eficientes, ya que están representados en el código compilado final como objetos JS, mientras JSONObject s se representan como objetos emulados de Java. La segunda solución significará menos sobrecarga mientras construye el JSO, pero comparativamente más (que el primero) cuando lo escribe.

Sin embargo, su solución funcionará bien.

+0

gracias , eso es más de lo que pedí ^^ – Stefan

3

También hay AutoBeans.

public interface MyJsonFactory extends AutoBeanFactory { 
    AutoBean<MyJsonObj> myJsonObj(); 
} 

public interface MyJsonObj { 
    @PropertyName("NumberVar") 
    int getNumberVar(); 
    @PropertyName("NumberVar") 
    void setNumberVar(int val); 

    @PropertyName("StringVar") 
    String getStringVar(); 
    @PropertyName("StringVar") 
    void setStringVar(String val); 

    @PropertyName("EventParameters") 
    List<String> getEventParameters(); 
    @PropertyName("EventParameters") 
    void setEventParameters(List<String> val); 
} 

MyJsonFactory factory = GWT.create(MyJsonFactory.class); 
AutoBean<MyJsonObj> bean = factory.myJsonObj(); 
MyJsonObj obj = bean.as(); 
// bean and obj are 2 distinct view on the exact same data 
obj.setNumberVar(1); 
obj.setStringVar("HelloWorld"); 
List<String> list = new ArrayList<String>(5); 
for (int i = 0; i < 5; i++) { 
    list.add("Array"); 
} 
obj.setEventParameters(list); 
System.out.println(AutoBeanCodex.encode(bean).getPayload()); 

se necesita la @PropertyName es como sus nombres de propiedades JSON no se alinean con las convenciones AutoBean (inspirado en Java Beans unos), donde getNumberVar() obtiene una propiedad numberVar (con minúscula n)

+0

gracias, así que otra cosa que tengo que echar un vistazo. – Stefan

Cuestiones relacionadas