如何在客户端上生成JSON

时间:2012-02-29 13:14:20

标签: json gwt

在项目中,我必须从服务器向客户端发送复杂的JSON命令。生成JSONObjects(字符串,数字等)将它们转换为字符串然后通过RequestBuilder发送它们是否有效,或者是否有更有效的方法。

将JSON对象转换为字符串(通过Object上的.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"]}

此致 斯蒂芬

2 个答案:

答案 0 :(得分:9)

您的解决方案将起作用。

如果您希望更有效地执行此操作,并且只希望支持支持JSON.stringify()的现代浏览器,则可以使用JavaScriptObjects代替JSONObjects并使用此本机方法:

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

或者,您可以通过执行以下操作来字符串化JSO:

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

JavaScriptObject更有效,因为它们在最终编译的代码中表示为JS对象,而JSONObject表示为模拟的Java对象。第二个解决方案在构建JSO时意味着更少的开销,但是当你对其进行字符串化时,它会比第一个解决方案更多(<第一个)。

你的解决方案可以正常工作。

答案 1 :(得分: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 Bean的约束),其中getNumberVar()获得numberVar属性(低于案例n