使用Jackson在Java中解析JSON的子集

鉴于Json,是否可以使用Jackson来解析消息的一部分? 假设我感兴趣的数据埋藏在深层次的字段中,我根本不关心为每个类创建DTO类。

鉴于一个非常简化的场景,我想在不知道任何关于它之前的结构的情况下对Telephone类进行建模:

...{ "firstName": "John", "lastName" : "doe", "age" : 26, "address" : { "streetAddress": "naist street", "city" : "Nara", "postalCode" : "630-0192" }, "phoneNumbers": [ { "type" : "iPhone", "number": "0123-4567-8888" }, { "type" : "home", "number": "0123-4567-8910" } ] }.... 

我正在考虑使用json-path和反序列化我感兴趣的部分。 一些伪:

 List phoneNrs = parse(".my.deep.structure.persons.phoneNumbers", List); 

 ObjectMapper mapper = new ObjectMapper(); JsonNode json = mapper.readTree("... your JSON ..."); 

使用JsonNode对象,然后可以调用get("my").get("deep").get("structure")来获取所需的节点。

一旦你掌握了那个节点,只需简单调用mapper.treeToValue(myDeepJsonNode, Telephone[].class)获得你的Telephonearrays。 您也可以使用TypeReference获取列表。

要访问深层JsonNode您还可以使用findValuefindPath方法。

Javadoc: https : //fasterxml.github.io/jackson-databind/javadoc/2.2.0/com/fasterxml/jackson/databind/JsonNode.html

是的,这可能是你在Pseudo代码中提到的方式。 “phoneNumbers”是一个关键,返回的值可以传递给Jackson deserialiying。

如果响应是一个映射数组,那么您可以迭代它们中的每一个并使用yourResponseAsJSONObject.get('phoneNumbers')方法获取值并将其传递给Jackson

或者使用@dimas提到的JsonPath

您可以使用JsonPath库。 使用此库,您可以将JsonPath输出直接映射到POJO。

伪:

 List phoneNrs = JsonPath.parse(json).read("$.my.deep.structure.persons.phoneNumbers", List.class); 

要使用Jackson有效地执行此操作,请通过JsonParser类( http://fasterxml.github.io/jackson-core/javadoc/2.5/com/fasterxml/jackson/core/JsonParser.html )使用Streaming API。

此方法不会分配额外的内存,也不会产生反序列化所有跳过数据的值的成本。 由于代码比使用Jackson的ObjectMapper要长得多且难以阅读,因此只有在分析过程中分析显示不可接受的GC活动或CPU使用情况时才执行此操作。

在点击“phoneNumbers”键之前,您可以跳过您不感兴趣的所有节点。 然后,您可以调用readValueAs函数来反序列化电话号码字典数组,如readValueAs(new TypeReference())

也可以看看:

  • 使用JsonParser阅读和编写教程: http : //www.cowtowncoder.com/blog/archives/2009/01/entry_132.html
  • 主要文档: https : //github.com/FasterXML/jackson-core