【问题标题】:Parse nested JSON with genson使用 genson 解析嵌套的 JSON
【发布时间】:2015-08-28 07:54:48
【问题描述】:

我正在尝试将从 Web API 获得的一些 JSON 解析为 Java 对象,但遇到了一些问题。

这是 JSON:

{
  "d":{
     "results":[
        {
          "__metadata" { some metadata I'm not interested in },
          "attribute1":"attribute id 1",
          "attribute2:"attribute value 1"
        },
        {
          "__metadata" { some metadata I'm not interested in },
          "attribute1":"attribute id 2",
          "attribute2:"attribute value 2"
        }
      ]
   }
}

现在我想将以下数据映射到 Java 类,以便结果是 Catalog 对象,结果数组中的值是 CatalogEntry 对象:

public class Catalog {
  private final List<CatalogEntry> values;

  public Catalog() {
      values = null;
  }

  public Catalog(@JsonProperty("results") List<CatalogEntry> values) {
      super();
      this.values = values;
  }
}

public class CatalogEntry {
  private String attribute1;
  private String attribute2;

  public CatalogEntry() {}

  public CatalogEntry(@JsonProperty("attribute1") String attribute1, 
                      @JsonProperty("attribute2") String attribute2) {
    this.attribute1 = attribute1;
    this.attribute2 = attribute2;
  }
}

通过以下行,我尝试将 JSON 字符串反序列化为 Catalog 对象:

Catalog catalog = genson.deserialize(json, Catalog.class);

之后,我尝试获取 Catalog 对象中的值,但得到 NullPointerException,因为它似乎是空的。我认为反序列化对 JSON 中的“d”对象有问题,但我该如何解决呢?任何帮助将不胜感激。

【问题讨论】:

    标签: java json genson


    【解决方案1】:

    问题是你有 2 个构造函数,一个没有参数,另一个有参数。在这种情况下,Genson 选择了空的构造函数。 并且由于属性不可见并且没有设置器,因此它不会填充值。

    因此,如果您希望 Genson 使用特定的构造函数,则必须使用 @JsonCreator 对其进行注释。顺便说一句,如果您使用此选项配置 Genson,则可以删除参数上的 JsonProperty("..."):

    Genson genson = new GensonBuilder()
      .useConstructorWithArguments(true)
      .create();
    

    另一种选择是告诉 Genson 通过这样做来使用私有属性:

    Genson genson = new GensonBuilder()
      .useFields(true, VisibilityFilter.PRIVATE)
      .create();
    

    在这种情况下,您不需要构造函数上的注释,因为 Genson 将使用 no arg 注释。我推荐你第一个选项。

    【讨论】:

    • 感谢您的回答,目前无法尝试您的提示,但明天我回来工作时会尝试。
    • 嘿,我通过指定正确的构造函数尝试了您的 tps,但仍未创建目录的值。
    • 哦,我看到你的目录对象不是json的根。你能把你的 json 改成没有 d: {results} 而只有 {results} 吗?否则,如果您所有传入的 json 将使用 d 作为键,您可以使用 wrapRootValues("d", "d") 配置 Genson
    • @MarkusWilhelm 这对你有用吗?您还可以在目录类上使用启用 wrapRootValues 和 @XmlRootElement("d") 的 JaxbBundle。
    • 谢谢。我今天试了一下,稍后会给出结果。
    猜你喜欢
    • 1970-01-01
    • 2019-08-20
    • 2017-08-03
    • 2018-10-06
    • 2013-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多