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

2022-09-03 01:20:41

是否有可能仅从 JSON 树中的特定节点(和“向下”)获得 Jackson 的 unmarshall?ObjectMapper

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

我希望插件作者不必处理流媒体API的低级细节;相反,只需传递一些上下文和特定的,然后能够使用可爱而方便的来解构其类的实例,将传递的节点视为树的根。JsonNodeJsonNodeObjectMapper


答案 1

请考虑以下 JSON:

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

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

public class Coordinates {

    private Double latitude;

    private Double longitude;
    
    // Default constructor, getters and setters omitted
}

为此,请使用 ObjectMapper 将整个 JSON 解析为 JsonNode

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 指针查询节点,并使用 ObjectMapper 将其解析为类:coordinatesCoordinates

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

JSON 指针是一种遍历 JSON 的路径语言。有关更多详细信息,请查看 RFC 6901。它自2.3版本起在Jackson中可用。


答案 2