使用GWT Overlay类型将JSON String转换为POJO

时间:2013-09-19 06:06:03

标签: java javascript json gwt

这是我需要转换为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字段位置变化,那该怎么办。

3 个答案:

答案 0 :(得分:3)

你的JSON是:

{
  "title": "test",
  "content": "test",
  "id": 1,
  "user": null,
  "hash": null,
  "created": 1379569937945,
  "modified": 1379569937945,
  "password": null,
  "views": 0
}

使用JavaScript objectsJSNI语法为它创建一个 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())。