使用Jackson在JSON响应中反嵌序列化嵌套对象中的字段

a p*_*a p 9 java json jackson deserialization

这似乎应该是一个相当解决/解决良好的问题,但我没有找到很多指导 - 希望这不是一个骗局.

我的场景基本上是我正在使用看起来像这样的分页JSON响应:

{ 
  "objects": [...],
  "meta": {
    "total": 5000,
    "page": 1,
    "result_pages": 20,
    "links": {
      "prev": null,
      "next": "/api/v3/objects/somequery?page=2"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

显然这是简化的,但希望它得到了重点.

所有我真正关心的是objectsnext字段,但看起来我必须创建一个完整的DTO层次结构才能成功反序列化嵌套字段.

是否有杰克逊注释让我跳过所有这些?如果没有,是否有一组最佳实践,不涉及大量空的类和文件?

Ser*_*rCe 9

是否有杰克逊注释让我跳过所有这些?

您可以使用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();
    }
}
Run Code Online (Sandbox Code Playgroud)

这里我使用了简单的地图反序列化,但如果你想要,你可以实现自己的快速反序列化.

和对象

class MetaObject {
    public List<Integer> objects;

    @JsonDeserialize(using = MetaDeserializer.class)
    public String meta;

    @Override
    public String toString() {
        return "MetaObject{" + "objects=" + objects + ", meta='" + meta + '\'' + '}';
    }
}
Run Code Online (Sandbox Code Playgroud)

如果你调用,MetaObject result = mapper.readValue("...", MetaObject.class)你会得到你想要的

MetaObject{objects=[1, 2, 3], meta='/api/v3/objects/somequery?page=2'}
Run Code Online (Sandbox Code Playgroud)