2012-02-29 5 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); 
}-*/; 

В качестве альтернативы, вы может stringify в JSO, выполнив:

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

JavaScriptObject s является более эффективным, поскольку они представлены в окончательном виде скомпилированного кода объектов JS, а JSONObject s представлены в виде эмулируемых объектов Java. Второе решение будет означать меньшие накладные расходы, когда вы создадите JSO, но сравнительно больше (чем первый), когда вы его стробируете.

Ваше решение будет работать нормально.

+0

спасибо , это больше, чем я попросил ^^ – Stefan

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 Beans из них), где getNumberVar() получает numberVar свойства (с строчными n)

+0

спасибо, так что еще одна вещь, на которую я должен взглянуть. – Stefan

Смежные вопросы