質問:
JSON
文字列を入力として受け取るサービスがあります。 JSON
スキーマは、一部のフィールドが常に存在するとは限らない場合は毎回異なります。それらが存在する場合、JaywayのJsonPath
を使用してこれらのフィールドの値をクエリするにはどうすればよいですか?
私が試したこと:
Jaywayの readmeページ の説明として_Option.DEFAULT_PATH_LEAF_TO_NULL
_を使用しました
_Configuration config = Configuration.defaultConfiguration()
.addOptions(Option.DEFAULT_PATH_LEAF_TO_NULL);
if (JsonPath.isPathDefinite(attribute.jsonPath))
{
String value = JsonPath.using(config).parse(currentTx).read(attribute.jsonPath);
if (value != null)
{
attributeValues.add(value);
}
}
else
{
List<String> attributeValuesArray = JsonPath.using(config).parse(currentTx).read(attribute.jsonPath);
for (String value : attributeValuesArray)
{
if (value != null)
{
attributeValues.add(value);
}
}
}
_
これにより、パスが見つからない場合にJsonPath.read()
がnull
を返すようになりますが、コードは次のようにスローします。
com.jayway.jsonpath.PathNotFoundException:パス$ ['somepath']にプロパティがありません
私がそれに存在しない道を与えるとき。誰かがこれを引き起こしている可能性があることを知っていますか?
私は自分が間違ったことに気づきました。 DEFAULT_PATH_LEAF_TO_NULL
オプションは、リーフノードのみを処理します。例えば:
サンプルJson
{
"foo":{
"bar":"value"
}
}
$.foo.tmp
が照会された場合、tmpはリーフノードであると想定されるため、JsonPathはnull
を返します。
$.tmp.tmp2
が照会されると、JsonPathは
com.jayway.jsonpath.PathNotFoundExceptionは、tmpがリーフではなく、存在しないためです。
これを回避するには、Option.SUPPRESS_EXCEPTIONS
を使用する必要があります。