Анализ результатов JSON Bing с помощью Jackson

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

{
   "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 результатов. Может ли кто-нибудь привести пример, иллюстрирующий, как использовать Джексона для десериализации «Результатов»?


person HighLife    schedule 22.12.2011    source источник


Ответы (2)


Во-первых, прочитайте свой 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. Бессовестный плагин: https://github.com/fge/json-schema-validator

person fge    schedule 22.12.2011
comment
results не выглядит как коллекция, но вы, кажется, перебираете ее. - person Bhesh Gurung; 23.12.2011
comment
Да, потому что JsonNode реализует Iterable<JsonNode>. При вызове контейнера (т. е. объекта или массива) он циклически перебирает элементы массива (массив) или значения свойств (объекты). В другом типе узла JSON базовый итератор пуст. - person fge; 23.12.2011
comment
Почему вы создаете экземпляр ObjectMapper, а затем ссылаетесь на него статически? - person nagytech; 08.09.2013

Ответ от 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()) {
  ...
}
person Chris R    schedule 23.12.2011
comment
Очень классная дополнительная часть - спасибо, что поделились. Кажется, хороший компаньон для привязки данных Джексона! - person StaxMan; 23.12.2011