2012-02-29 14 views
8

W projekcie, muszę wysłać złożone polecenia JSON z serwera do klienta. Czy efektywnie generuje JSONObjects (łańcuchy, liczby itp.), Przekształca je w ciąg znaków, a następnie przesyła je za pomocą RequestBuilder lub istnieje bardziej skuteczna metoda.Jak genearte JSON na kliencie

Czy jest skuteczny do konwersji obiektów JSON na ciąg (metodą .ToString na obiekcie)

przykład

Kod:

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

wyjściowa:

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

Pozdrowienia, Stefan

Odpowiedz

9

Twoje rozwiązanie zadziała.

Jeśli chcesz to zrobić bardziej efektywnie, a chcesz tylko obsługiwać nowoczesnych przeglądarek z obsługą JSON.stringify(), można pracować w JavaScriptObjects zamiast JSONObjects i używać tej natywną metodę:

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

Alternatywnie, ty można stringify się JSO wykonując:

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

JavaScriptObject ów są bardziej efektywne, ponieważ są one reprezentowane w końcowej skompilowanego kodu jako obiekty JS, natomiast JSONObject s są reprezentowane jako emulowane obiekty Java. Drugie rozwiązanie będzie oznaczało mniej narzutów podczas konstruowania JSO, ale stosunkowo więcej (niż pierwsze), gdy je uszeregujesz.

Twoje rozwiązanie będzie działać dobrze.

+0

dzięki , to więcej niż prosiłem o ^^ – Stefan

3

Istnieje również 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 potrzebna jest jak wasze imiona obiekcie JSON nie pokrywają się z konwencjami AutoBean (zainspirowany Java Beans nich), gdzie getNumberVar() dostaje własności numberVar (z małymi n)

+0

dzięki, więc kolejna rzecz, na którą muszę się przyjrzeć. – Stefan

Powiązane problemy