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, которую вы будете использовать в своем приложении.