Существует разница между способом обработки значений Джексоном и способом их распечатки.
При использовании JsonSmartJsonProvider
этой строки ...
JsonPath.read(parse, "$.phoneNumbers");
... возвращает JSONArray
и метод toString()
- который вызывается, когда вы 'печатаете' экземпляр JSONArray
, достаточно сообразительный, чтобы знать, что он имеет дело с JSON, поэтому он печатает это состояние в виде строки JSON.Например:
[{"type":"home","number":"212 555-1234"},{"type":"office","number":"646 555-4567"}]
Но когда вы используете JacksonJsonProvider
, тогда эта строка ...
JsonPath.read(parse, "$.phoneNumbers");
... возвращает List
из LinkedHashMap
и toString()
реализация вызывается, когда вы «печатаете» этот экземпляр, не поддерживающий JSON, поэтому он печатает это:
[{type=home, number=212 555-1234}, {type=office, number=646 555-4567}]
Если вы хотите напечатать JSON при использовании JacksonJsonProvider
, то вы должны напечатать его с помощью чего-то, чтов курсе JSON.Вот пример:
String payload = "{\n" +
" \"firstName\": \"John\",\n" +
" \"lastName\": \"Smith\",\n" +
" \"isAlive\": true,\n" +
" \"age\": 25,\n" +
" \"height_cm\": 167.6,\n" +
" \"address\": {\n" +
" \"streetAddress\": \"21 2nd Street\",\n" +
" \"city\": \"New York\",\n" +
" \"state\": \"NY\",\n" +
" \"postalCode\": \"10021-3100\"\n" +
" },\n" +
" \"phoneNumbers\": [\n" +
" {\n" +
" \"type\": \"home\",\n" +
" \"number\": \"212 555-1234\"\n" +
" },\n" +
" {\n" +
" \"type\": \"office\",\n" +
" \"number\": \"646 555-4567\"\n" +
" }\n" +
" ],\n" +
" \"children\": [],\n" +
" \"spouse\": null\n" +
"}";
// this is a simpler way of declaring and using the JacksonJsonProvider
ObjectMapper objectMapper = new ObjectMapper();
Configuration conf = Configuration.builder()
.jsonProvider(new JacksonJsonProvider(objectMapper))
.build();
Object obj = JsonPath.using(conf).parse(payload).read("$.phoneNumbers");
// prints out:
// [{type=home, number=212 555-1234}, {type=office, number=646 555-4567}]
System.out.println(obj);
// prints out:
// [{"type":"home","number":"212 555-1234"},{"type":"office","number":"646 555-4567"}]
System.out.println(objectMapper.writer().writeValueAsString(obj));