Необязательный 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.