JSON路径 - 提取所有地图

时间:2016-02-25 15:24:29

标签: json jsonpath

我正在尝试编写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

1 个答案:

答案 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"]