2016-07-19 7 views
4

Вопрос:Дополнительный JsonPath с помощью Jayway

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

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

Я использовал Option.DEFAULT_PATH_LEAF_TO_NULL в Jayway-х readme page объяснил

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: Отсутствует pr работа в пути $ ['somepath']

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

ответ

3

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

Образец Json

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

Если $.foo.tmp опрашивается, JsonPath вернется null, как TMP, предполагают, чтобы быть листовым узлом.

Если $.tmp.tmp2 опрашивается, JsonPath выбросит

com.jayway.jsonpath.PathNotFoundException, как TMP не лист и нет.

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