【问题标题】:JSON path - extract all mapsJSON 路径 - 提取所有地图
【发布时间】:2023-04-03 21:16:01
【问题描述】:

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

【问题讨论】:

    标签: json jsonpath


    【解决方案1】:

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

    【讨论】:

    • jq 有我可以使用的 API 吗?在我看来,它只是一个命令行工具,但也许我错过了一些东西。我在 Java 应用程序中使用 JSONPath。
    • 我已经成功使用 Runtime.getRuntime().exec( cmd ); jq 但我相信使用 JNI 访问 jq 的 C API 需要一些工作。元素在那里——见github.com/stedolan/jq/wiki/C-API:-jq-program-invocation;你可能想在github.com/stedolan/jq/issues创建一张票
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-12
    • 1970-01-01
    • 2014-10-16
    • 2021-09-02
    • 2015-10-27
    • 1970-01-01
    相关资源
    最近更新 更多