1

次のような JSON 文字列があります。

json =  "{\"Things\": \n" +
    "    {\"Thing\": {\n" +
    "        \"ID\":\"123\",\n" +
    "        \"name\":\"Yet Another Thing\",\n" +
    "        \"price\":\"$12.99\",\n" }\n" +
    "    }\n" +
    "}";

同じステートメント/アサートで、 IDofThing123 ANDであるとname断言できる方法はありますか?Yet Another Thing

現時点では、フィルターの使用に失敗しているようです:

JsonPath.read(json, "$.Things.Thing[?(@.ID == '123')].name")

次の例外が発生します。

java.lang.IllegalArgumentException: 無効なコンテナー オブジェクトです

[]上記の JSON 文字列に配列表記がないためでしょうか。あるべきですか?

関連して、Hamcrest (JSON アサート付き) を使用するための適切な紹介はありますか? 公式のチュートリアルは知っていますが、いつも間違っているようです...

更新:これの合理的な理由は次のとおりです:いくつかのThing要素が返された場合、どの順序が保証されていないか(したがって、それらすべてをループしない限り一致できませんThing[1])? 1 つの要素が正しい ID と正しい名前の両方を持っていることを確認するにはどうすればよいですか? 子供たちを別々にチェックすると、1 つThingは正しい名前を持ち、もう 1 つは正しい ID を持っているが、両方を持っているリスクはありませんか? (それはその JSON 形式で可能でしょうか、それともとにかくその場合は配列にする必要があり"Thing": [ { ... }, { ... } ], ...ますか?

PS: 上記の JsonPath を最終的に次のように使用しようとしました:assertEquals("Yet Another Thing", JsonPath.read(json, "$.Things.Thing[?(@.ID == '123')].name")); そのため、例外が発生した可能性もあります。また、最初に JsonPath メーリング リストでこの質問をしましたが、これまでに返信がなかったので、ここでもっと早く助けが得られることを望んでいました... :)

4

1 に答える 1

1

チュートリアルはあなたの問題の解決策を提供します。

JsonAssert.with(json).assertThat("$.Things.Thing.ID", Matchers.equalTo("123"))
    .assertThat("$.Things.Thing.name", Matchers.equalTo("Yet Another Thing"));
于 2014-03-10T16:51:13.987 に答える