使用Jackson从JSON树中的特定节点映射对象
jackson的ObjectMapper
是否可以仅从JSON树中的特定节点(和“向下”)解组?
用例是可扩展的文档格式。 我想要遍历树,然后将当前路径发布到可扩展的插件集,以查看用户是否正在使用以及知道如何处理文档的该部分的插件。
我希望插件作者不必处理JsonNode
或流API的低级细节; 相反,只是传递一些上下文和一个特定的JsonNode
,然后能够使用可爱和方便的ObjectMapper
来解组它们的类的实例,考虑作为树的根传递的节点。
考虑以下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 }
为此,使用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 Pointer查询coordinates
节点并使用ObjectMapper
将其解析为Coordinates
类:
JsonNode coordinatesNode = node.at("/address/coordinates"); Coordinates coordinates = mapper.treeToValue(coordinatesNode, Coordinates.class);
JSON指针是一种遍历JSON的路径语言。 有关更多详细信息,请查看RFC 6901 。 自版本2.3以来,它在Jackson中可用。