【问题标题】:Using GWT Overlay type to convert JSON String to POJO使用 GWT Overlay 类型将 JSON String 转换为 POJO
【发布时间】:2013-09-19 06:06:02
【问题描述】:

这是我需要转换为 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 字段位置发生变化会怎样。

【问题讨论】:

  • 不是您问题的真正答案:您可以查看 AutoBeans 框架 (code.google.com/p/google-web-toolkit/wiki/AutoBean)。这会自动为带有 getter 和 setter 的接口生成覆盖类型。由于它使用 JSON 进行(反)序列化,它可以比手动解析更容易解决您的用例。

标签: java javascript json gwt


【解决方案1】:

你的 JSON 是:

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

只需使用JavaScript objectsJSNI 语法为其创建一个覆盖层(即,一个零开销的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...
}

【讨论】:

    【解决方案2】:

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

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

    或者如果你想得到一个数组,这样做:

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

    其中children 将是一个名为data 的元素内的数组。

    【讨论】:

      【解决方案3】:

      你有很多选择。

      如果您想在 js 中解析 JSON,只需 check this post。如果您的客户端支持它或 javascript json 库,请使用 JSON.parse()。然后myJsonObject.title 将返回"test",而不取决于它在json 中的位置。

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

      但我更愿意使用与 GWT 兼容的工具,例如 JSONParserThis post 有一些有用的信息。出于同样的原因,使用 parseStrict() 时要小心(解析器内部机制也使用 eval())。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-05-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-02
        • 1970-01-01
        • 2019-07-06
        • 1970-01-01
        相关资源
        最近更新 更多