在项目中,我必须从服务器向客户端发送复杂的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"]}
此致 斯蒂芬
答案 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
)