这似乎应该是一个相当解决/解决良好的问题,但我没有找到太多的指导 - 希望这不是一个骗局。
我的场景基本上是我正在使用看起来像这样的分页JSON响应:
{
"objects": [...],
"meta": {
"total": 5000,
"page": 1,
"result_pages": 20,
"links": {
"prev": null,
"next": "/api/v3/objects/somequery?page=2"
}
}
}
显然这是简化的,但希望它能够解决问题。
我真正关心的是objects
和next
字段,但它看起来像我必须创建一个完整的DTO层次结构才能成功反序列化嵌套字段。
是否有杰克逊注释可以让我跳过所有这些?如果没有,是否有一套最佳做法,这些做法并不涉及大量空洞的类和文件?
答案 0 :(得分:8)
是否有杰克逊注释可以让我跳过所有这些?
您可以使用JsonDeserialize
并定义自定义JsonDeserializer。
class MetaDeserializer extends JsonDeserializer<String> {
@Override
public String deserialize(JsonParser jp, DeserializationContext ctx) throws IOException {
JsonNode tree = jp.readValueAsTree();
return tree.get("links").get("next").asText();
}
}
这里我使用了简单的地图反序列化,但如果你想要,你可以实现自己的快速反序列化。
和对象
class MetaObject {
public List<Integer> objects;
@JsonDeserialize(using = MetaDeserializer.class)
public String meta;
@Override
public String toString() {
return "MetaObject{" + "objects=" + objects + ", meta='" + meta + '\'' + '}';
}
}
如果你调用MetaObject result = mapper.readValue("...", MetaObject.class)
,你会得到你想要的东西
MetaObject{objects=[1, 2, 3], meta='/api/v3/objects/somequery?page=2'}