Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/464.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript JSONPath按节点键筛选不起作用_Javascript_Json_Node.js_Xpath_Jsonpath - Fatal编程技术网

Javascript JSONPath按节点键筛选不起作用

Javascript JSONPath按节点键筛选不起作用,javascript,json,node.js,xpath,jsonpath,Javascript,Json,Node.js,Xpath,Jsonpath,我试图使用(Stefan Goessner的Node.js实现)选择包含某个键的节点,但前提是该节点的路径与某个父节点和祖父母匹配。我可以按祖父母过滤,但不能按父母过滤 给定以下JSON: { "a": { "x": { "d": 4, "e": 5 } }, "b": { "y": { "d": 40, "e": 50

我试图使用(Stefan Goessner的Node.js实现)选择包含某个键的节点,但前提是该节点的路径与某个父节点和祖父母匹配。我可以按祖父母过滤,但不能按父母过滤

给定以下JSON:

{
    "a": {
        "x": {
            "d": 4,
            "e": 5
        }
    },
    "b": {
        "y": {
            "d": 40,
            "e": 50
        }
    },
    "c": {
        "z": {
            "d": 400,
            "e": 500
        }
    }
}
这个提取查询查找具有祖父母
a或b
和键
d
的节点:

$..[a,b][?(@.d)]
我得到的结果是正确的:

[
    {
        "d": 4,
        "e": 5
    },
    {
        "d": 40,
        "e": 50
    }
]
但就我的一生而言,我不能按父母的
x
y
部分进行选择

给定每个节点的路径,正则表达式可能看起来像
*\(a | b)\(x | y)$

如果我不能让它工作,那么我必须检索所有匹配的节点,然后根据每个节点以
.x
.y
结尾的路径过滤列表,这对于大数据来说可能会浪费大量的周期。以下是我一直在使用的在线工具:


在它上面睡觉后,我能够在5分钟内使用(您可以从弹出窗口或访问中选择它):

结果分别为:

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

我觉得我已经找到了一个JSONPath无法处理的用例,但是因为这是我第一次尝试,所以我对它的查询语法没有最高的信心

不幸的是,自2013年以来,JSPath有一个已知的bug/特性,它返回对节点的引用,而不是其路径,而JSONPath提供了一个
jp.nodes()
方法,该方法返回一个
{path:…,value:…}
对象,其中包含与模式和节点值匹配的路径。这使得JSPath对于大型JSON树中的任何实际导航都相对无用(就像由类似的解析器生成的那样)

希望知道这些框架的失败之处能帮助人们节省时间来决定使用哪种框架。我觉得目前可能没有JSON查询语言能够满足2个相对温和的需求:1)同时匹配路径/值,2)获取这些匹配的路径。不幸的是,GraphQL使用web服务器端点而不是原始数据,因此它在第1层的操作步骤太高。也许有人可以提供类似于GraphQL的框架,但对于JSON,它也可以返回结果的路径

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