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

时间:2016-06-23 15:55:51

标签: java json jackson

是否可以让杰克逊的ObjectMapper只能从JSON树中的特定节点(以及#39;下来)解组?

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

我希望插件作者不必处理JsonNode或流API的低级细节;相反,只是传递一些上下文和一个特定的JsonNode,然后能够使用可爱和方便的ObjectMapper解组他们的类的实例,考虑作为树的根传递的节点。

1 个答案:

答案 0 :(得分:20)

考虑以下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
}

为此,使用JsonNode将整个JSON解析为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 Pointer查询coordinates节点,并使用ObjectMapper将其解析为Coordinates类:

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

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