我使用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属性名称。
我很感激我可以调查的路线的所有建议。
答案 0 :(得分:3)
没有自定义反序列化器的最简单的解决方案是使用@JsonAnySetter
。杰克逊将为每个未映射的属性调用带有此注释的方法。
例如:
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
,在这种情况下应该返回Map<String, List<Stuff>)
。
答案 1 :(得分:1)
我认为最简单的解决方案是使用自定义JsonDeserializer。它允许您逐步解析输入,并仅提取构建对象所需的信息。
以下是如何实现自定义反序列化器的简单示例:custom jackson deserializer