2017-04-12 13 views
4

特定のjsonドキュメントで、jsonパスが存在するかどうかを検証する方法は?JSONパスがJSONに存在する場合の検証方法

私はjayway-jsonpathを使用して、以下のコード

JsonPath.read(jsonDocument, jsonPath) 

上記のコードは、潜在的に例外

com.jayway.jsonpath.PathNotFoundException下に投げることができる持っています:パスなし結果: $ [ 'abc']

これを軽減するため、tryiの前にパスが存在するかどうかを検証します参考のためにJsonPath.read

でそれを読むためにngの私は、次の2つのドキュメンテーションを経て、本当に私が欲しいものを手に入れることができませんでした。

  1. http://www.baeldung.com/guide-to-jayway-jsonpath
  2. https://github.com/json-path/JsonPath
+2

をなぜ例外をキャッチし、それを処理しない:ここでは

はJUnitの5とあなただけのJSONのパスが存在するかどうかを確認するためのtry/catchブロックを避けて、この設定オプションを使用する方法を示すAssertJと例です。そう? – Lucero

+0

私はそれを行うことができますが、読み込み前にパスを検証する方がよりクリーンなアプローチになると考えていました –

+0

必ずしもそうではありません - この特定の例外をキャッチするよりもパスをチェックするほうが高価かもしれません – Lucero

答えて

2

コメントに記載されているようにあなたは、パスライトせずに存在するかどうかを確認するために、よりエレガントな方法があるかもしれない、例外をキャッチすることができますことは事実であるがコード全体にcatchブロックを試してください。

あなたはjayway-jsonpathで、次の設定オプションを使用することができます。

com.jayway.jsonpath.Option.SUPPRESS_EXCEPTIONS 

をアクティブに例外がスローされないこのオプションを使用します。 メソッドを使用する場合は、パスが見つからない場合は、nullが返されます。

@ParameterizedTest 
@ArgumentsSource(CustomerProvider.class) 
void replaceStructuredPhone(JsonPathReplacementArgument jsonPathReplacementArgument) { 
    DocumentContext dc = jsonPathReplacementHelper.replaceStructuredPhone(
      JsonPath.parse(jsonPathReplacementArgument.getCustomerJson(), 
        Configuration.defaultConfiguration().addOptions(Option.SUPPRESS_EXCEPTIONS)), 
      "$.cps[5].contactPhoneNumber", jsonPathReplacementArgument.getUnStructuredPhoneNumberType()); 
    UnStructuredPhoneNumberType unstructRes = dc.read("$.cps[5].contactPhoneNumber.unStructuredPhoneNumber"); 
    assertThat(unstructRes).isNotNull(); 
    // this path does not exist, since it should have been deleted. 
    Object structRes = dc.read("$.cps[5].contactPhoneNumber.structuredPhoneNumber"); 
    assertThat(structRes).isNull(); 
} 
関連する問題