2011-12-22 2 views
2

Я бы хотел использовать Jackson для анализа результатов JSON Bing, но я немного смущен тем, как его использовать. Вот пример JSON, полученного от Bing:Анализ результатов JSON Bing с помощью Jackson

{ 
    "SearchResponse":{ 
     "Version":"2.2", 
     "Query":{ 
     "SearchTerms":"jackson json" 
     }, 
     "Web":{ 
     "Total":1010000, 
     "Offset":0, 
     "Results":[ 
      { 
       "Title":"Jackson JSON Processor - Home", 
       "Description":"News: 04-Nov-2011: Jackson 1.9.2 released; 23-Oct-2011: Jackson 1.9.1 released; 04-Oct-2011: Jackson 1.9.0 released (@JsonUnwrapped, value instantiators, value ...", 
       "Url":"http:\/\/jackson.codehaus.org\/", 
       "CacheUrl":"http:\/\/cc.bingj.com\/cache.aspx?q=jackson+json&d=4616347212909127&w=cbaf5322,11c785e8", 
       "DisplayUrl":"jackson.codehaus.org", 
       "DateTime":"2011-12-18T23:12:00Z", 
       "DeepLinks":"[...]" 
      } 
     ] 
     } 
    } 
} 

Мне действительно нужны только данные в массиве результатов. Этот массив может иметь от 0 до n результатов. Может ли кто-нибудь представить пример, который иллюстрирует, как использовать Джексона для десериализации «результатов»?

ответ

10

Прежде всего, прочитайте свой JSON как дерево. Сделайте копию ObjectMapper и прочитайте свой JSON, используя метод readTree().

Это даст вам JsonNode. Возьмите результаты в другой JsonNode и цикл через массив:

final ObjectMapper mapper = new ObjectMapper(); 

final JsonNode input = mapper.readTree(...); 

final JsonNode results = input.get("SearchResponse").get("Web").get("Results"); 

/* 
* Yes, this works: JsonNode implements Iterable<JsonNode>, and this will 
* cycle through array elements 
*/ 
for (final JsonNode element: results) { 
    // do whatever with array elements 
} 

Вы также могли бы рассмотреть возможность проверки ввод с помощью реализации JSON Schema. Бесстыдный штекер: https://github.com/fge/json-schema-validator

+0

'results' не выглядит как коллекция, но вы, кажется, итерацию через него. –

+1

Да, потому что 'JsonNode' реализует' Iterable '. Когда вызывается контейнер (т. Е. Объект или массив), он будет циклически перемещаться по элементам массива (массиву) или значениям свойств (объектов). На другом узле JSON основной итератор пуст. – fge

+0

Почему вы создаете экземпляр ObjectMapper, а затем ссылаетесь на него статически? – nagytech

3

Ответ на fge - это путь, если вы хотите напрямую использовать Джексон.

Если вы хотите работать на pojos на основе json, вы можете попробовать json2pojo (https://github.com/wotifgroup/json2pojo - мой бесстыдный плагин :)), чтобы взять ваш образец json и сгенерировать классы java.

Предполагая, что вы называете класс верхнего уровня «Bing», то вы можете использовать такой код:

final ObjectMapper mapper = new ObjectMapper(); 

final Bing bing = ObjectMapper.readValue(..., Bing.class); 

/* 
* you may need a null check on getResults depending on what the 
* Bing search returns for empty results. 
*/ 
for (Result r : bing.getSearchResponse().getWeb().getResults()) { 
    ... 
} 
+0

Очень крутой дополнительный кусок - спасибо за обмен. Похоже, хороший компаньон для привязки данных Джексона! – StaxMan

Смежные вопросы