Плоская структура JSONPath не может фильтровать по строке
При использовании JSONPath со следующими
{
"tradeID": "12345",
"version": "1"
}
с выражением $.tradeID[?(@ == '12345')]
ничего не возвращается.
Однако с $[?(@ == '12345')]
выражение разрешается правильно.
Зачем? Похоже, что выражение фильтра вообще не может работать с tradeID как с базовым листом?
1 ответ
Выражение $.tradeID[?(@ == '12345')]
говорит перейти от корневого элемента к дочернему элементу tradeID
и сопоставить значения, отфильтрованные для выбора только соответствующих элементов '12345
". поскольку tradeID
это простое значение вместо массива в ваших входных данных, это не совпадает. Если значение tradeID
был массив, то это будет соответствовать.
вход
{
"tradeID": [ "12345", "67890" ],
"version": "1"
}
JSONPath
$.tradeID[?(@ == '12345')]
Выход
[
"12345"
]
Как вы обнаружили, выражение $[?(@ == '12345')]
совпадает Это выражение говорит, чтобы перейти от корня к любому из его дочерних элементов и выбрать значения со значениями, отфильтрованными для выбора только '12345'
, Однако следует помнить, что если в документе есть другие ключи, сопоставленные со значением '12345
', тогда это может вернуть больше, чем вы ожидали.
вход
{
"tradeID": "12345",
"version": "1",
"otherID": "12345"
}
JSONPath
$[?(@ == '12345')]
Выход
[
"12345",
"12345"
]
Если целью является просто потянуть tradeID
, то фильтрующее выражение не требуется.
вход
{
"tradeID": "12345",
"version": "1",
"otherID": "12345"
}
JSONPath
$.tradeID
Выход
[
"12345"
]
Если целью является соответствие конкретного документа tradeID
в массиве из нескольких документов вы можете выбрать все элементы массива верхнего уровня с фильтрующим выражением, которое соответствует желаемому tradeID
,
вход
[
{
"tradeID": "12345",
"version": "1"
},
{
"tradeID": "67890",
"version": "2"
}
]
JSONPath
$.[?(@.tradeID == '12345')]
Выход
[
{
"tradeID": "12345",
"version": "1"
}
]