Parsing a subset of JSON in Java using Jackson

前端 未结 4 2315
花落未央
花落未央 2021-02-14 21:51

Given a Json, is it possible to use Jackson to only parse out a section of the message? Say that the data I\'m interested in is buried in a deep hierarchy of fields and I simply

相关标签:
4条回答
  • 2021-02-14 22:36

    Yes, it is possible the way you have mentioned in the Pseudo code. "phoneNumbers" is a key and value returned can be passed on to Jackson deserialiying.

    If the response is an array of maps then you can iterate through each one of them and use the yourResponseAsJSONObject.get('phoneNumbers') method to get the value and pass it on to Jackson

    or use JsonPath as mentioned by @dimas

    0 讨论(0)
  • 2021-02-14 22:40

    You can use JsonPath library. With this library you can map your JsonPath output directly into POJO's.

    Pseudo:

    List<Telephone> phoneNrs = JsonPath.parse(json).read("$.my.deep.structure.persons.phoneNumbers", List.class);
    
    0 讨论(0)
  • 2021-02-14 22:43

    To do this efficiently with Jackson, use the Streaming API via the JsonParser class (http://fasterxml.github.io/jackson-core/javadoc/2.5/com/fasterxml/jackson/core/JsonParser.html).

    This approach will allocate no additional memory and will not incur the cost of deserializing values for all of the skipped data. Since the code will be much longer and more difficult to read than using Jackson's ObjectMapper, only do this if profiling shows unacceptable GC activity or CPU usage during parsing.

    You can skip all of the nodes that you are uninterested in until you hit the "phoneNumbers" key. Then you can call the readValueAs function to deserialize the array of phone number dictionaries like so readValueAs(new TypeReference<MyPhoneNumberType[]>()).

    See also:

    • a tutorial on reading and writing with JsonParser: http://www.cowtowncoder.com/blog/archives/2009/01/entry_132.html
    • The main documentation: https://github.com/FasterXML/jackson-core
    0 讨论(0)
  • 2021-02-14 22:45
    ObjectMapper mapper = new ObjectMapper();
    JsonNode json = mapper.readTree("... your JSON ...");
    

    Using the JsonNode object you can then call get("my").get("deep").get("structure") to get the node you want.

    Once you got your hands on that node, a simple call to mapper.treeToValue(myDeepJsonNode, Telephone[].class) will get you your array ofTelephone. You can get a list using a TypeReference as well.

    To get to your deep JsonNode you can also use the findValue and findPath methods.

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

    0 讨论(0)
提交回复
热议问题