JSON 的 XMLstarlet?

max*_*zig 5 xml json

是否有类似于XMLstarlet但适用于 JSON 而不是 XML 的工具?

我的用例:从分层 JSON 文档中提取某些值,因为它们是由某些 REST API 返回的。

能够通过类似 XPath 的表达式选择节点之类的东西在那里会有所帮助。

max*_*zig 8

jq 提供了丰富的表达式语言,用于从 JSON 文档中选择元素。

因此,它类似于(采用 XPath 表达式)的sel命令xmlstartlet

例如,以记录格式提取数字海洋上可用的 CentOS 7 内核版本列表:

$ jq '[ .kernels[] | select(.name | test("^CentOS 7 x64")) | del(.name)
        | "\(.version) \(.id)"] | .[]' kernels.json
Run Code Online (Sandbox Code Playgroud)

或者同样简化一点:

jq '.kernels[] | select(.name | test("^CentOS 7 x64")) |
     "\(.version) \(.id)" ' kernels.json
Run Code Online (Sandbox Code Playgroud)

哪里可以像这样获得json:

$ curl -o kernels.json -X GET -H "Content-Type: application/json" \
    -H "Authorization: Bearer $bearer" \
 "https://api.digitalocean.com/v2/droplets/$droplet/kernels?page=1&per_page=1000"
Run Code Online (Sandbox Code Playgroud)

还有ObjectPath,一种不同的 JSON 查询语言 - 尽管 jq 似乎更广泛可用(例如,它打包在 Fedora 23 上)。

在程序中重用这样的查询片段很容易,例如 jq 有多个绑定(例如Python)并且 ObjectPath 也可以作为 Python 模块使用。