Плоская структура 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"
  }
]
Другие вопросы по тегам