2011-12-22 7 views
2

JSON Bingの結果を解析するためにJacksonを使用したいと思いますが、使い方について少し混乱しています。 Bingから受け取ったJSONの例を次に示します。JSON Bingの結果をJavaで解析する

{ 
    "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をインスタンス化し、readTree()メソッドを使用してJSONを読み取ります。

これはあなたに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

+0

'results'コレクション似ていない、まだあなたはそれを反復するように見える:あなたは、あなたがこのようなコードを使用することができ、トップレベルのクラス「ビング」を呼び出すと仮定

。 –

+1

はい、 'JsonNode'は' Iterable 'を実装しています。コンテナ(オブジェクトまたは配列)上で呼び出されると、配列要素(配列)またはプロパティ値(オブジェクト)が循環します。別のJSONノードタイプでは、基本となるイテレータは空です。 – fge

+0

ObjectMapperをインスタンス化して静的に参照するのはなぜですか? – nagytech

3

あなたがジャクソンを直接使用したい場合は、fgeによる回答があります。

jsonに基づいてpojosで作業したい場合は、json2pojo(https://github.com/wotifgroup/json2pojo - 私の恥知らずのプラグ:)を試して、サンプルjsonを取得してJavaクラス。

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