Анализ результатов JSON Bing с Джексоном - PullRequest
2 голосов
/ 23 декабря 2011

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

Ответы [ 2 ]

10 голосов
/ 23 декабря 2011

Сначала прочитайте ваш 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

3 голосов
/ 23 декабря 2011

Ответ 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()) {
  ...
}
...