JSONPath按节点键过滤不起作用

时间:2018-04-26 02:21:42

标签: javascript json node.js xpath jsonpath

我尝试使用https://github.com/dchester/jsonpath(Stefan Goessner的JSONPath的Node.js实现)选择包含某个键的节点,但仅限于节点' s路径匹配某个父母和祖父母。我可以通过祖父母过滤,但不能过滤父母。

给出以下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
    }
]

但是对于我的生活,我可以通过父xy部分进行选择。

给定每个节点的路径,正则表达式可能类似于.*\.(a|b)\.(x|y)$

如果我无法使用此功能,那么我必须检索所有匹配的节点,然后按每个节点的路径过滤列表,该路径以.x.y结尾可能是大量数据的浪费周期。以下是我一直在使用的在线工具:

http://www.jsonquerytool.com/

http://jsonpath.com/

http://jsonpathfinder.com/

1 个答案:

答案 0 :(得分:0)

在上面睡觉后,我可以使用JSPath在5分钟内完成查询(您可以从jsonquerytool弹出框中选择或访问http://www.jsonquerytool.com/#/JSPath):

..a.x.{.d}

..b.y.{.d}

结果分别为:

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

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

我觉得我已经找到了一个JSONPath无法解决的用例,但由于这是我尝试的第一件事,因此我对其查询语法没有最高的信心。

不幸的是,自2013年以来,JSPath有一个已知的错误/功能,它返回对节点的引用但不返回其路径,这与JSONPath不同,后者提供jp.nodes()方法,该方法返回包含路径的{path: ..., value: ...}对象匹配模式和那里的节点的值。这使得JSPath对于大型JSON树中的任何实际导航(如Babylon等解析器生成的类型)相对无用。

希望知道这些框架落在何处会有助于节省时间来决定使用哪些框架。我感觉目前可能没有JSON查询语言满足2)相对适度的需求:1)同时匹配路径/值和2)获得那些匹配的路径。遗憾的是,GraphQL使用Web服务器端点而不是原始数据,因此它在第1层操作太高。也许这里有机会为某人提供类似GraphQL的框架,但对于JSON,它也会返回结果的路径。