2

这是我需要转换为 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 字段位置不同怎么办。

4

3 回答 3

3

你的 JSON 是:

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

只需使用JavaScript 对象JSNI语法为它创建一个覆盖(即,一个零开销的 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...
}
于 2013-09-20T11:41:42.163 回答
1

如果您只是尝试使用 GWT 覆盖类型从对象中获取 int,请尝试以下操作:

public final native String getId() /*-{
    return this.id;
}-*/;

或者,如果您想获得一个数组,请执行以下操作:

public final native JsArray getData() /*-{
    return this.data.children;
}-*/;

wherechildren将是一个名为data.

于 2013-09-19T21:31:38.813 回答
0

你有很多选择。

如果您想在 js 中解析 JSON,请查看这篇文章JSON.parse()如果您的客户支持它或 javascript json 库,请使用它。然后myJsonObject.title将返回"test",而不取决于它在 json 中的位置。

您还可以使用 eval() ,它是一个原生 Js 函数,但如果您不确定 JSON 的来源,它可能会执行恶意代码。

但我宁愿使用与 GWT 兼容的工具,如JSONParser这篇文章有一些关于它的有用信息。出于同样的原因,使用 parseStrict() 时要小心(解析器内部机制也使用 eval())。

于 2013-09-19T07:10:15.737 回答