一尘不染

使用Jackson映射JSON树中特定节点的对象

json

是否可以ObjectMapper仅从JSON树中的特定节点(和“向下”)进行Jackson的解组?

用例是可扩展的文档格式。我想走一棵树,然后将当前路径发布到一组可扩展的插件,以查看用户是否正在使用和知道如何处理该文档部分的插件。

我希望插件作者不必处理JsonNodeAPI或流API
的底层细节;取而代之的是,只需传递一些上下文和一个特定的JsonNode,然后就可以使用可爱且方便的方法ObjectMapper来解组其类的实例,并将传递的节点视为树的根。


阅读 331

收藏
2020-07-27

共1个答案

一尘不染

考虑以下JSON:

{
  "firstName": "John",
  "lastName": "Doe",
  "address": {
    "street": "21 2nd Street",
    "city": "New York",
    "postalCode": "10021-3100",
    "coordinates": {
      "latitude": 40.7250387,
      "longitude": -73.9932568
    }
  }
}

并考虑将coordinates节点解析为以下Java类:

public class Coordinates {

    private Double latitude;

    private Double longitude;

    // Default constructor, getters and setters omitted
}

要做到这一点,分析整个JSON成JsonNode具有ObjectMapper

String json = "{\"firstName\":\"John\",\"lastName\":\"Doe\",\"address\":{\"street\":"
            + "\"21 2nd Street\",\"city\":\"New York\",\"postalCode\":\"10021-3100\","
            + "\"coordinates\":{\"latitude\":40.7250387,\"longitude\":-73.9932568}}}";

ObjectMapper mapper = new ObjectMapper();
JsonNode node = mapper.readTree(json);

然后使用JSON指针查询coordinates节点并将ObjectMapper其解析为Coordinates该类:

JsonNode coordinatesNode = node.at("/address/coordinates");
Coordinates coordinates = mapper.treeToValue(coordinatesNode, Coordinates.class);

JSON指针是遍历JSON的路径语言。有关更多详细信息,请检查RFC
6901
。从2.3版开始,它就可以在Jackson中使用。

2020-07-27