2017-03-23 23 views
0

私はJsonPathの探索を始めました。私はそれでできることだけでなく、効果的な戦略を探求したいと思っています。JsonPathの配列を反復するための戦略

たとえば、json文字列内の1つの要素に含まれる配列を反復処理する必要があるとします。

https://github.com/jayway/JsonPath#path-examplesの「店舗」の例を使用しています。図書のリスト自体を取得するには

、私はこのような何かを行うことができます想像:

List<?> allBooks = JsonPath.<List<?>>read(context, "$.store.book"); 

それはそれについてこのように考えるのは理にかなっていますか?

これを反復して私が不確かなのは論理です。

私は「ブック」POJOを定義し、このような何かを行うことができると思っているだろう:

for (int ctr = 0; ctr < allBooks.size(); ++ ctr) { 
     Book book = JsonPath.<Book>read(context, ".[" + ctr + "]"); 
     System.out.println("book[" + book + "]"); 
    } 

しかし、これは動作しません。この時点の "read"メソッドは、JSONArrayを返します。

コードサンプルの最後の行はhttps://github.com/jayway/JsonPath#what-is-returned-whenに近いですが、これはすべての繰り返しでjsonを解析する必要があります。 「DocumentContext」クラスには、タイプパラメータを取ることができる「read」メソッドがありますが、「JsonPath」はありません。

このようなナビゲートにはどのような戦略が適していますか?

答えて

1

JSONパスは、あなたがすでに見たようにMapsのリストを返します。これらの値をオブジェクトにマップする方法を伝える方法が必要です。カスタム設定が必要です。 Gsonのような他のプロバイダがありますが、私はジャクソンしか使用していません。

Configuration configuration = Configuration 
     .builder() 
     .jsonProvider(new JacksonJsonProvider()) 
     .mappingProvider(new JacksonMappingProvider()) 
     .build(); 

第二のステップは、TypeRefとジェネリック型情報を指定し、タグを読み取るときに沿って通過させることです。

List<Book> allBooks = JsonPath.using(configuration) 
     .parse(context) 
     .read("$.store.book", new TypeRef<List<Book>>() {}); 

結果として、Bookオブジェクトの素敵なリストが得られます。

+0

これは問題なく動作しますが、JsonPath(https://github.com/jayway/JsonPath)のメインのドキュメントページでTypeRefについて言及していません。私はTypeRefの使用を推測するのはClassオブジェクトのようなものですが、それはジェネリックな型情報を効果的に伝達します。 –

関連する問題