2011-11-20 51 views
9

私は何をしようとしているかに近いいくつかの回答を見つけましたが、それを十分に働かせることはできませんでした。私はこの例のようなJSONの束を持っています(実際にはいくつかのレベルが深く、アクセスしたいレベルの何百ものアイテムがあります):{"query":{"pages":{"links":[{"word":"bobsyeruncle","code":4},{"word":"easyaspie","code":3}]}}}。フォーマットを変更することはできません。他の誰かのAPIです。私には必要ないことがたくさんあります。実際、私は["bobsyeruncle"、 "easyaspie"]の配列のようなものがほしいだけです。ジャクソンを使用してJSON配列から文字列を取得

アレイを持たないより簡単なバージョンのJSONを試してみましたが、rootNode.get( "query")を使って簡単に1つの文字列にアクセスできました。 ( "ページ")... https://stackoverflow.com/questions/338586/a-better-java-json-library/338608#338608に記載されています。しかし、私はその方法で配列に乗ることができませんでした。私がここで見つけた答えのほとんどは、 "リンク"のような "単語"と "コード"の両方を含むPOJOを作成したいと仮定しています。私が望む文字列にアクセスするには、「単語」と「コード」の両方を含む「リンク」のリストのようなものを作成し、「コード」を無視する必要がありますか?それは正しいとは思わない。

(誰もがどこかJacksonInFiveMinutesチュートリアルと全体のjavadocの間でドキュメント/チュートリアルに私を指すことができればまた、私はそれがあまりにも役立つだろうと確信している。)

ETAは、これは働いていた、私は!:

を考えます
  String theJsonString = "{\"query\":{\"pages\":{\"links\":" 
       + "[{\"word\":\"bobsyeruncle\"},{\"word\":\"easyaspie\"}]}}}"; 
     ObjectMapper mapper = new ObjectMapper(); 
     JsonNode rootNode = mapper.readTree(theJsonString); 
     JsonNode interestingObjectNode = rootNode.path("query").path("pages").path("links"); 
     for (int i = 0; i < interestingObjectNode.size(); i ++) { 
      System.out.println(interestingObjectNode.get(i).path("word").asText()); 
     } 

答えて

7

おそらく、このブログのエントリは役に立ちます:Traversing JSON trees with Jackson

あなたの正確な問題はわかりませんが、JSON配列は名前ではなくエントリのインデックスを渡すことでトラバースされます。したがって、objectNode.get("key")を使用する場合は、代わりにarrayNode.get(0)を使用します。 安全に再生して「欠落」するエントリを許可する場合は、arrayNode.path(0)(およびJSONオブジェクトの場合も同様)を使用します。

また、JSONツリー(JsonNode)とPOJOの間に戻ることができます。 ObjectMapperには、表現間の変換に複数のメソッドがあります(convertValue()、readAsTree()、treeToValue()、valueToTree())。したがって、一部のパーツではデータバインディングを使用し、他の部分ではツリーモデルを使用できます。サブツリーをPOJOとしてバインドすることもありますが、ツリー・モデルを使用してデータ・バインディングの高レベル・アクセスとサブツリーにアクセスするだけの場合もあります。これは非常に強力な方法ですが、しばらく時間がかかります。

希望すると便利です。

+0

私の前のコメントを削除しました - 私は結局そこに行きました。 – umbraphile

+0

安全?そのジャックソンの使用で「安全」とはどういう意味ですか? @StaxMan – gumuruh

+0

「get」を使用し、一致するノードがない場合はnullを返し、チェックする必要があるという意味で安全です。しかし、 'path'を使うと、仮想の "missing node"が返されるので、nullチェックは必要ありません。 – StaxMan

0

GoogleのGSONでは、いくつかのプロパティを持たないPOJOを作成すると、対応するJSONは無視されます。一致する名前を持つプロパティのみを設定します。単語を取得するためにすべてのループを書くことを避けるためにLambdaJを使用し、その後

Query{ 
Pages{ 
Word[] Links; 
} 
} 

Word{ 
String word; 
String code; 
} 

と:なぜ、このようなクラスを作成していませんか?

それは魅力的な外観hereないとJSONPath

のMongoDBとRavenDBのようにそこに文書データベースのロット等の保管のための彼らのフォーマットとしてJSONを使用してみてください。複雑なJSONのクエリはそれらに組み込まれており、使用しているのと同じライブラリを使用します。

+1

なぜ否定的な投票をしているのかコメントを残しますか?それがコードの場合は、明らかに、さまざまなPOJOクラスの構成を説明する擬似コードです。 – Zasz

+0

オリジナルの質問は、POJO定義の使用が望ましくないことを示していたので、おそらく単に言葉遣いを改善して、彼のアプローチの代わりにデータバインディングを検討することを提案しましたか?(jackson対gsonを使用するのも同じです) – StaxMan

関連する問題