web-dev-qa-db-ja.com

Jaywayを使用したオプションのJsonPath

質問:

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']にプロパティがありません

私がそれに存在しない道を与えるとき。誰かがこれを引き起こしている可能性があることを知っていますか?

12

私は自分が間違ったことに気づきました。 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を使用する必要があります。

9