这是我需要转换为POJO的字符串,以便在我的GWT应用程序中轻松访问:
{"title":"test","content":"test","id":1,"user":null,"hash":null,"created":1379569937945,"modified":1379569937945,"password":null,"views":0}
看看这个答案:Parse json with gwt 2.0
使用Overlay类型似乎很容易。然而,那里的示例显示例如获取ID:
public final native int getId() /*-{
return parseInt(this.u[0]);
}-*/;
问题是我的GWT应用程序可能获得字段顺序的JSON字符串可能会更改。为此可以做些什么?我不是Javascript专家,但是如果我理解正确的话,这段代码会显示在解析的第一个字段上获取ID:return parseInt(this.u[0]);
就像我的情况一样,如果JSON字符串中的ID字段位置变化,那该怎么办。
答案 0 :(得分:3)
你的JSON是:
{
"title": "test",
"content": "test",
"id": 1,
"user": null,
"hash": null,
"created": 1379569937945,
"modified": 1379569937945,
"password": null,
"views": 0
}
使用JavaScript objects和JSNI语法为它创建一个 overlay (即,一个零开销的Java对象,它代表并完全映射您的JSON结构),并使用JsonUtils.safeEval()
安全地评估有效负载并返回重叠的实例。
import com.google.gwt.core.client.JsonUtils;
public class YourFancyName extends JavaScriptObject {
/**
* Overlay types always have protected, zero-arg ctors.
*/
protected YourFancyName() { }
/**
* Safely evaluate the JSON payload and create the object instance.
*/
public static YourFancyName create(String json) {
return (YourFancyName) JsonUtils.safeEval(json);
}
/**
* Returns the title property.
*/
public native String getTitle() /*-{
return this.title;
}-*/;
/**
* Returns the id property.
*/
public native int getId() /*-{
return this.id;
}-*/;
// And the like...
}
答案 1 :(得分:1)
如果您只是尝试使用GWT覆盖类型从对象获取int,请尝试以下操作:
public final native String getId() /*-{
return this.id;
}-*/;
或者如果你想获得一个数组,请执行以下操作:
public final native JsArray getData() /*-{
return this.data.children;
}-*/;
其中children
是一个名为data
的元素内的数组。
答案 2 :(得分:0)
你有很多选择。
如果你想在check this post的js中解析JSON。如果您的客户支持它或javascript json lib,请使用JSON.parse()
。然后myJsonObject.title
将返回"test"
,而不是取决于它在json中的位置。
您也可以使用eval()作为本机Js函数,但如果您不确定JSON的来源,则可以执行恶意代码。
但我宁愿选择像JSONParser这样的GWT兼容工具。 This post有一些有用的信息。由于同样的原因,请注意使用parseStrict()(解析器内部机制也使用eval())。