Цифровой сад — общедоступная персональная база знаний

Лупа для поиска
  • Свежие правки
  • Карта сайта
  • 3. Знания /

    Как в JSONPath обратиться к родительскому объекту, если дочерний удовлетворяет условию

    Если ознакомиться со спецификацией RFC 9535 JSONPath и её реализацией, то можно обнаружить, что в JSONPath нет простого способа обратиться к родителю, как в XPath. Но есть способы похитрее, которые работают в зависимости от реализации.

    Пример JSON.

    {
      "key": "value#parent",
      "value": [
        {
          "key": "value#child1"
        },
        {
          "key": "value#child2"
        }
      ]
    }

    Задача

    Получить значение родительского узла /key, если хотя бы один из дочерних объектов /value/0 или /value/1 удовлетворят условию /value/0/key=='value#child2' или /value/1/key=='value#child2'.

    Способ №1

    Использовать Jayway реализацию JSONPath для Java, которая поддерживает некоторые функции, например empty.

    Запрос.

    $..[?(@.value[?(@.key=='value#child2')] empty false)].key

    Результат.

    [
      "value#parent"
    ]

    Ключевое выражение @.value[?(@.key=='value#child2')] empty false позволяет проверить, что список подходящих дочерних объектов не пустой.

    Способ №2

    Работает, если дочерние объекты не являются элементами списка и для нашего примера не подходит. С ним можно ознакомиться на Stack Overflow, а поэкспериментировать на сайте JSONPath Online Evaluator.