2012-02-29 18 views
8

Nel progetto, devo inviare comandi JSON complessi che formano il server al client. È efficace generare JSONObjects (stringhe, numeri, ecc.) Convertirli nella stringa e quindi inviarli tramite RequestBuilder oppure esiste un metodo più efficace.Come generare un JSON sul client

è efficace per convertire oggetti JSON a stringa (tramite il metodo .toString sulla Object)

Codice esempio:

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()); 

uscita:

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

saluti, Stefan

risposta

9

La soluzione che hai funzionerà.

Se si vuole fare in modo più efficiente, e si desidera solo per supportare i browser moderni con il supporto per JSON.stringify(), è possibile lavorare in JavaScriptObjects invece di JSONObjects e utilizzare questo metodo nativo:

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

In alternativa, è possono in stringa un OCS facendo:

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

JavaScriptObject s sono più efficienti perché sono rappresentati nel codice compilato finale come oggetti JS, mentre JSONObject s sono rappresentati come oggetti Java emulati. La seconda soluzione comporterà meno overhead mentre costruisci il JSO, ma comparativamente più (rispetto al primo) quando lo stringa.

La tua soluzione funzionerà comunque bene.

+0

grazie , questo è più di quanto ho chiesto ^^ – Stefan

3

C'è anche 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()); 

è necessario il @PropertyName è come i vostri nomi di proprietà JSON non si allineano con le convenzioni AutoBean (ispirato da Java quelli fagioli), dove getNumberVar() ottiene una proprietà numberVar (con minuscole n)

+0

grazie, quindi un'altra cosa che devo dare un'occhiata. – Stefan

Problemi correlati