我尝试使用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
}
]
但是对于我的生活,我可以通过父x
或y
部分进行选择。
给定每个节点的路径,正则表达式可能类似于.*\.(a|b)\.(x|y)$
如果我无法使用此功能,那么我必须检索所有匹配的节点,然后按每个节点的路径过滤列表,该路径以.x
或.y
结尾可能是大量数据的浪费周期。以下是我一直在使用的在线工具:
答案 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,它也会返回结果的路径。