JSON Path String Оценка корневого значения

Иметь службу, которая возвращает очень простой ответ JSON:

{
    "methodresult": "error",
    "ErrorCode": 2,
    "ErrorCodeText": "format",
    "ErrorMessage": "Json parse exception at pos:171 msg:Expecting \"key\""
}

И я пытаюсь использовать JSONPath для запроса, если значение "methodresult" возвращается как "ошибка".

Исходя из документации / примеров, которые я видел, я ожидал, что это сработает:

$[?(@.methodresult=="error")]

Однако, основываясь на валидаторах, которые я использую, вот так ( https://jsonpath.curiousconcept.com/) не вижу никакого логического ответа.

Когда я пытаюсь написать выражение для чего-то, чего нет в массиве, я что-то упускаю?

2 ответа

Включите ответ JSON в квадратных скобках, и это работает.

[{
"methodresult": "error",
"ErrorCode": 2,
"ErrorCodeText": "format",
"ErrorMessage": "Json parse exception at pos:171 msg:Expecting \"key\""
}]


$[?(@.methodresult=="error")].methodresult

Результат:

[  
"error"
]

Нет, я не думаю, что вы что-то упускаете.

Проблема заключается в отсутствии настоящего стандарта для JSONPath. Есть несколько идей / предложений (в том числе несколько связанных с JSON Pointer, которые уже несколько лет застряли в фазе "ПРЕДЛАГАЕМЫЙ СТАНДАРТ"), много реализаций, и все они в некотором роде различны, даже если предположительно реализуют одно и то же. предложение (например, предложение Стефана Гесснера).

Например, при использовании Jayway JsonPath эти выражения JSONPath

$.[?(@.methodresult == 'error')]
 $[?(@.methodresult == 'error')]
 .[?(@.methodresult == 'error')]
  [?(@.methodresult == 'error')]

вывести тот же результат для ввода JSON из вопроса:

{
    "methodresult": "error",
    "ErrorCode": 2,
    "ErrorCodeText": "format",
    "ErrorMessage": "Json parse exception at pos:171 msg:Expecting \"key\""
}

Они возвращают непустой массив, содержащий объект JSON, который имеет methodresult поле равно error, И этого следовало ожидать, если взглянуть на предложение Стефана Гесснера...

Попытка тех же выражений для заданного ввода здесь (ссылка в вопросе) или здесь (которая предлагает выполнение заданного выражения JSONPath с использованием 4 различных реализаций), и результаты будут смешанными: неудачный анализ, ошибки выполнения, пустой массив и иногда, как и ожидалось.

Суть в том, что до тех пор, пока не будет истинного стандарта для JSONPath, единственный способ убедиться, что выражение JSONPath работает должным образом, - написать его для конкретной реализации JSONPath, которую вы будете использовать в своем приложении.

Другие вопросы по тегам