Фильтр JSONPath по ключу узла не работает - PullRequest
0 голосов
/ 26 апреля 2018

Я пытаюсь выбрать узлы, содержащие определенный ключ, используя https://github.com/dchester/jsonpath (реализация Node.js JSONPath Стефана Гесснера), но только если путь узла соответствует определенному родителю ипрародитель.Я могу фильтровать по прародителю , но не по родительскому.

Учитывая следующий JSON:

{
    "a": {
        "x": {
            "d": 4,
            "e": 5
        }
    },
    "b": {
        "y": {
            "d": 40,
            "e": 50
        }
    },
    "c": {
        "z": {
            "d": 400,
            "e": 500
        }
    }
}

И этот запрос извлечения, который ищет узлы, имеющиедедушка a or b и ключ d:

$..[a,b][?(@.d)]

Я получаю правильный результат:

[
    {
        "d": 4,
        "e": 5
    },
    {
        "d": 40,
        "e": 50
    }
]

Но я не могу выбрать по жизниродительская x или y часть.

Учитывая пути к каждому узлу, регулярное выражение может выглядеть примерно так: .*\.(a|b)\.(x|y)$

Если я не могу заставить это работать, тоЯ должен извлечь все совпадающие узлы и затем отфильтровать список по пути каждого узла, заканчивающемуся .x или .y, что может быть большим количеством потерянных циклов для больших данных.Вот онлайн-инструменты, которые я использую:

http://www.jsonquerytool.com/

http://jsonpath.com/

http://jsonpathfinder.com/

1 Ответ

0 голосов
/ 26 апреля 2018

После сна я смог заставить запрос работать в течение 5 минут с помощью JSPath (вы можете выбрать его во всплывающем окне jsonquerytool или посетить http://www.jsonquerytool.com/#/JSPath):

..a.x.{.d}

и

..b.y.{.d}

Результаты соответственно:

[
    {
        "d": 4,
        "e": 5
    }
]

и

[
    {
        "d": 40,
        "e": 50
    }
]

Мне кажется, что я нашел вариант использования, которыйJSONPath просто не может справиться, но так как это было первое, что я попробовал, у меня нет наибольшего доверия к его синтаксису запроса.

К сожалению, JSPath имеет известную ошибку / функцию с 2013 года, когда он возвращаетссылка на узел, но не на его путь, в отличие от JSONPath, который предоставляет метод jp.nodes(), который возвращает объект {path: ..., value: ...}, содержащий путь, который соответствует шаблону, и значение узла там. Это делает JSPath относительно бесполезным для любого реального мира.Навигация внутри большого дерева JSON (например, вид, создаваемый синтаксическими анализаторами, такими как Babylon ).

Надеюсь, знание того, где рушатся эти структуры, поможет кому-то сэкономить время, решая, какой из них использовать.У меня такое ощущение, что в настоящее время не может быть языка запросов JSON, который удовлетворял бы 2 относительно скромным потребностям: 1) сопоставление пути / значения одновременно и 2) получение пути к этим совпадениям.К сожалению, GraphQL использует конечные точки веб-сервера вместо необработанных данных, поэтому он работает на уровне 1 выше уровня.Возможно, здесь есть возможность предоставить GraphQL-подобный фреймворк, но для JSON, который также возвращает пути к результатам.

...