2012-02-29 116 views
8

在項目中,我必須從服務器向客戶端發送複雜的JSON命令。生成JSONObjects(字符串,數字等)是否有效將它們轉換爲字符串,然後通過RequestBuilder發送它們還是有更有效的方法。如何在客戶端上生成JSON

它是有效的JSON對象轉換爲串(通過的ToString方法上的對象)

代碼例如:

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

輸出:

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

問候, 斯蒂芬

回答

9

您的解決方案將工作。

如果你想更有效地做到這一點,你只希望支持現代瀏覽器與JSON.stringify()支持,您可以在JavaScriptObjects工作,而不是JSONObjects和使用本機方法:

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

另外,您可以通過執行一個字符串化JSO:

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

JavaScriptObject s爲更有效的,因爲它們在最終的編譯代碼作爲JS對象表示,而JSONObject被表示爲模擬的Java對象。第二種解決方案在構建JSO時意味着更少的開銷,但是在將其串聯化時相對更多(而不是第一種)。

雖然您的解決方案將工作得很好。

+0

感謝,這多於我要求^^ – Stefan 2012-02-29 16:45:52

3

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

需要的@PropertyName是你的JSON屬性名稱不與AutoBean公約對齊(由Java組件的人的啓發),其中getNumberVar()得到一個numberVar財產(以小寫n

+0

謝謝,所以我不得不看看另一件事。 – Stefan 2012-02-29 16:53:43