Необязательный JsonPath с использованием Jayway

вопрос:

у меня есть служба, которая принимает в JSON строку в качестве входных данных. The JSON схема отличается каждый раз, когда некоторые поля не всегда присутствуют. Как я могу запросить значения этих полей, используя jayway's JsonPath когда они присутствуют?

что я пробовал:

я использовал Option.DEFAULT_PATH_LEAF_TO_NULL как Jayway это readme страница объяснил

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.джейвей.помощью jsonpath.PathNotFoundException: отсутствует свойство в path $['somepath']

когда я даю ему несуществующий путь. Кто-нибудь знает, что может быть причиной этого?

1 ответов


я понял, что я сделал неправильно. The DEFAULT_PATH_LEAF_TO_NULL опция заботится только о листовых узлах. Например:

Образец Json

{
    "foo":{
        "bar":"value"
    }
}

если $.foo.tmp запрашивается, JsonPath вернет null as tmp должен быть листовым узлом.

если $.tmp.tmp2 запрашивается, JsonPath будет бросать

com.джейвей.помощью jsonpath.PathNotFoundException как tmp не является листом и отсутствует.

чтобы обойти это, следует использовать Option.SUPPRESS_EXCEPTIONS.