我正在尝试编写JSON路径表达式以从JSON结构中提取所有地图和子图。考虑到JSON:
{
"k1":"v1",
"arr": ["1","2","3" ,["7","8"] ],
"submap":
{
"a":"b",
"c":"d"
},
"submap_2":
{
"a_2":"b",
"c_2":"d",
"nested": { "x":"y" }
}
}
我想提取元素"submap", "submap_2", "nested"
。
我尝试过JSONPath表达式,如:
$..*[?(@.length()>0 && @.*[0] empty true)]
这将返回我想要的结构,但也会返回[ "7","8" ]
。有没有办法用JSONPath做到这一点,还是在代码中做得更好?
(一个简洁的JSONPath测试工具在这里:http://jsonpath.herokuapp.com/)
(我正在使用的具体实现是这个:https://github.com/jayway/JsonPath)
答案 0 :(得分:0)
jq查询通常与JSONPath查询非常相似,我强烈建议您尽可能考虑使用jq。
假设示例数据位于名为example.json的文件中,以下jq调用将生成您请求的结果:
$ jq 'path(.. | select(type=="object")) | .[-1] | select(.)' example.json
"submap"
"submap_2"
"nested"
第一个过滤器(path(....)
)的输出由所有JSON对象的路径的完整路径表达式组成,包括顶级对象本身。需要剩余的过滤器来生成您请求的确切输出。但实际上,完整路径表达式可能更有用,因此查看第一个过滤器产生的输出可能会有所帮助:
$ jq -c 'path(.. | select(type=="object"))' example.json
[]
["submap"]
["submap_2"]
["submap_2","nested"]