Jsonpath with Jackson or Gson

后端 未结 2 1281
再見小時候
再見小時候 2020-12-01 14:22

I am getting a big json document and i want to parse only some part of it to my java classes. I was thinking to use something like jsonpath to extract partial data from it i

相关标签:
2条回答
  • 2020-12-01 14:24
    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);
    JsonNode coordinatesNode = node.at("/address/coordinates");
    

    This is a JSON Pointer approach which I found here: https://cassiomolin.com/2016/07/13/using-jackson-and-json-pointer-to-query-and-parse-an-arbitrary-json-node/

    0 讨论(0)
  • 2020-12-01 14:40

    The Jayway JsonPath library has support for reading values using a JSON path.

    For example:

    String json = "...";
    
    Map<String, Object> book = JsonPath.read(json, "$.store.book[0]");
    System.out.println(book);  // prints {category=reference, author=Nigel Rees, title=Sayings of the Century, price=8.95}
    
    Double price = JsonPath.read(json, "$.store.bicycle.price");
    System.out.println(price);  // prints 19.95
    

    You can also map JSON objects directly to classes, like in GSON or Jackson:

    Book book = JsonPath.parse(json).read("$.store.book[0]", Book.class);
    System.out.println(book);  // prints Book{category='reference', author='Nigel Rees', title='Sayings of the Century', price=8.95}
    

    If you would like to specifically use GSON or Jackson to do the deserialization (the default is to use json-smart), you can also configure this:

    Configuration.setDefaults(new Configuration.Defaults() {
        private final JsonProvider jsonProvider = new JacksonJsonProvider();
        private final MappingProvider mappingProvider = new JacksonMappingProvider();
    
        @Override
        public JsonProvider jsonProvider() {
            return jsonProvider;
        }
    
        @Override
        public MappingProvider mappingProvider() {
            return mappingProvider;
        }
    
        @Override
        public Set<Option> options() {
            return EnumSet.noneOf(Option.class);
        }
    });
    

    See the documentation for more details.

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