2017-11-17 11 views
0

とルートノードの配列の存在を確認し、私はルートノードはhamcrestライブラリからこの方法を使用JSONpathに存在することを確認できますはJSON以下応答からJSONpath

assertThat(json, hasJsonPath("$.tool")); 

これは、ルートをチェック「ツール」というノードが存在します。

{ 
    "tool": 
    { 
     "jsonpath": 
     { 
      "creator": 
      { 
       "name": "Jayway Inc.", 
       "location": 
       [ 
        "Malmo", 
        "San Francisco", 
        "Helsingborg" 
       ] 
      } 
     } 
    }, 

    "book": 
    [ 
     { 
      "title": "Beginning JSON", 
      "price": 49.99 
     }, 

     { 
      "title": "JSON at Work", 
      "price": 29.99 
     } 
    ] 
} 

変数に格納された配列を使用して2つのルートノード(ツールとブック)の存在を確認するにはどうすれば実現できますか?私はそれらの値やサブノードの値を心配していません。これら2つのルートノードが応答に存在し、有効なパスであることを確認したいだけです。

JsonPath jp = new JsonPath(json); 

String[] rootNodes = {"tool", "book"}; 
assertThat(json, hasJsonPath(json.getString(rootNodes))); 

しかし、コンパイラがgetString方法に不満だった:

「JSON」変数の私のAPIレスポンスを架線した後、私はこのような何かを試してみました。

この問題を解決する方法はありますか?

答えて

1

ルートノード演算子は$であるため、$をマップに読み込むだけでルートノード名にそのマップがキーされます。例えば

// Approach 1 
Map<String, Object> read = JsonPath.read(json, "$"); 

assertThat(read.size(), is(2)); 

assertThat(read.keySet(), hasItem("tool")); 
assertThat(read.keySet(), hasItem("book")); 

// Approach 2: if you want a String[] then ... 
String[] rootNodeNames = read.keySet().toArray(new String[read.size()]); 
assertThat(rootNodeNames, Matchers.both(arrayWithSize(2)).and(arrayContainingInAnyOrder("book", "tool"))); 

// Approach 3: if you want to hide it all behind the hasJsonPath() matcher 
// note: each of these assertion will cause your JSON string to be parsed 
// so it's more efficient to do that once and assert against the 
// resulting map as I did above 
assertThat(json, hasJsonPath("$", Matchers.hasKey("tool"))); 
assertThat(json, hasJsonPath("$", Matchers.hasKey("book"))); 
+0

私は、コンソールに$を印刷し、ルートノードの値も返されたことがわかります。私はいくつかの種類の配列メソッドを使用して、値のないルートノードのみを抽出することを考えていました。 Btw、どのライブラリがプロジェクトに「is」メソッドを追加しますか?エラーが発生する –

+0

2つのルートノードが存在し、これらのルートノードの名前が "tool"と "book"であることを確認するのが目的の場合、上記のコードはまさにそれを行います。そのアサーションを作るためにルートノード名をString []に抽出する必要はありません。あなたのもう一つの質問: 'is'への完全修飾パスは' org.hamcrest.Matchers 'です。つまり、 'hasItem'と同じクラスによって提供されます。 – glytching

+0

ルートノード名を 'String []'に抽出し、 'hasJsonPath'呼び出しの中で正規表現子全体を隠す方法を示す質問を更新しました。 – glytching

関連する問題