繁体   English   中英

使用Jackson反序列化包含在具有未知属性名称的对象中的JSON

[英]Deserialize a JSON wrapped in an object with an unknown property name using Jackson

我正在使用Jackson将JSON从ReST API反序列化为使用Jackson的Java对象。

我遇到的问题是,一个特定的ReST响应包含在由数字标识符引用的对象中,如下所示:

{
  "1443": [
    /* these are the objects I actually care about */
    {
      "name": "V1",
      "count": 1999,
      "distinctCount": 1999
      /* other properties */
    },
    {
      "name": "V2",
      "count": 1999,
      "distinctCount": 42
      /* other properties */
    },
    ...
  ]
}

我的(可能是天真的)将JSON反序列化的方法一直是创建镜像POJO并让Jackson简单地自动映射所有字段,这很好。

问题是ReST响应JSON对我实际需要的POJO数组有一个动态的数字引用。 我无法创建镜像包装器POJO,因为属性名称本身既是动态的又是非法的Java属性名称。

我很感激我可以调查的路线的任何和所有建议。

没有自定义反序列化器的最简单的解决方案是使用@JsonAnySetter Jackson将为每个未映射的属性调用带有此注释的方法。

例如:

public class Wrapper {
  public List<Stuff> stuff;

  // this will get called for every key in the root object
  @JsonAnySetter
  public void set(String code, List<Stuff> stuff) {
    // code is "1443", stuff is the list with stuff
    this.stuff = stuff;
  }
}

// simple stuff class with everything public for demonstration only
public class Stuff {
  public String name;
  public int count;
  public int distinctCount;
}

要使用它,你可以这样做:

new ObjectMapper().readValue(myJson, Wrapper.class);

@JsonAnyGetter ,你可以使用@JsonAnyGetter ,在这种情况下应该返回Map<String, List<Stuff>)

我认为最简单的解决方案是使用自定义JsonDeserializer。 它允许您逐步解析输入并仅提取构建对象所需的信息。

下面是一个如何实现自定义反序列化器的简单示例: 自定义jackson反序列化器

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM