24

JSON文字列は次のとおりです

{
   "rank":"-text_relevance",
   "match-expr":"(label 'star wars')",
   "hits":{
      "found":7,
      "start":0,
      "hit":[
         {"id":"tt1185834",
             "data":{
                "actor":["Abercrombie, Ian","Baker, Dee","Burton, Corey"],
                "title":["Star Wars: The Clone Wars"]
             }
         },
         .
         .
         .
         {"id":"tt0121766",
             "data":{
                "actor":["Bai, Ling","Bryant, Gene","Castle-Hughes, Keisha"],
                "title":["Star Wars: Episode III - Revenge of the Sith"]
             }
         }
       ]
    },
    "info":{
       "rid":"b7c167f6c2da6d93531b9a7b314ad030b3a74803b4b7797edb905ba5a6a08",
       "time-ms":2,
       "cpu-time-ms":0
    }
    } 

多くのフィールドがありますが、データフィールドが必要です。これは機能しません:

mapper.readvalue(jsonString,Data.class); 

Jacksonに「データ」フィールドだけを読み取らせるにはどうすればよいですか?

4

3 に答える 3

33

Jackson 2.3 には、使用できる JsonPointer クラスが追加されました。リリースの簡単な概要に簡単な例があります。

使い方は簡単です: JSON のような場合

{
    "address" : { "street" : "2940 5th Ave", "zip" : 980021 },   
    "dimensions" : [ 10.0, 20.0, 15.0 ] 
}

次のような表現を使用できます。

  JsonNode root = mapper.readTree(src); 
  int zip =root.at("/address/zip").asIntValue(); 
  double height = root.add("/dimensions/1").asDoubleValue();// assuming it's the second number in there
于 2015-07-30T23:08:57.463 に答える
15

これを行う最も簡単な方法は、Jackson TreeModelを使用することだと思います。Jacksonに JSON 入力をJsonNodeオブジェクトに解析させてから、データ構造についてある程度の知識があると仮定してクエリを実行させます。このようにして、ほとんどのデータを無視して、必要なデータにたどり着くことができJsonNodesます。

// String input = The JSON data from your question
ObjectMapper mapper = new ObjectMapper();

JsonNode rootNode = mapper.readValue(input.getBytes(), JsonNode.class); 

// can also use ArrayNode here, but JsonNode allows us to get(index) line an array:
JsonNode hits = rootNode.get("hits");

// can also use ObjectNodes here:
JsonNode oneHit = null;
JsonNode dataObj = null;

int idx = 0;

Data data = null;


if (hits != null)
{
    hits = hits.get("hit");

    if (hits != null)
    {
        while ((oneHit = hits.get(idx)) != null)
        {
            dataObj = oneHit.get("data");
            System.out.println("Data[" + idx + "]: " + dataObj);
            idx++;
        }
    }
}

出力:

 Data[0]: {"id":"tt1185834","data":{"actor":["Abercrombie, Ian","Baker, Dee","Burton, Corey"],"title":["Star Wars: The Clone Wars"]}}
 Data[1]: {"id":"tt0121766","data":{"actor":["Bai, Ling","Bryant, Gene","Castle-Hughes, Keisha"],"title":["Star Wars: Episode III - Revenge of the Sith"]}}

Dataクラスの実装を引き続き使用できますが、これには、上記のように に依存するか、または を使用して、Stringそれぞれを表すを取得し、 を使用して再解析する必要があると思います。datatoStringJsonNode.getText()ObjectMapper

mapper.readValue(dataArray, Data.class));

別の方法として、Jackson Streaming Model を使用し、各要素の開始を示す入力の部分が表示されるまで自分でノードをインターセプトし、文字列を消費して各文字列の内容dataを呼び出すこともできます。objectMapper.readValue

于 2012-07-26T21:08:55.937 に答える
5

Json-path は、そのような要件の非常に優れた代替手段になる可能性があります-ジャクソン以外のソリューションで問題ない場合: http://code.google.com/p/json-path/

于 2012-07-27T00:06:49.943 に答える