json - 嵌套对象构造JQ

标签 json object jq

来自Types And Values Documentation :

Object Construction

The value can be any expression (although you may need to wrap it in parentheses if, for example, it contains colons), which gets applied to the {} expression's input (remember, all filters have an input and an output).

{foo: .bar}

[ ... ]

Because that is so common, there's a shortcut syntax for it: {user, title}.

给出以下示例 json

{
    "foo": {
        "bar": {
            "value": 42,
            "valid": true
        },
        "valid": false
    },
    "valid": false
}

如果我想要完整 foo 对象(删除外部valid 键),我可以得到使用所需的输出

{ foo }

Demo


不幸的是,文档没有提到任何获得相同行为的方法,但对于更深键,使用上面的示例,仅使用 .foo.bar 获取输出对象 对象看起来像:

{ "foo": { "bar": .foo.bar } }

Demo

这将生成以下(所需的)json 输出:

{
  "foo": {
    "bar": {
      "value": 42,
      "valid": true
    }
  }
}

注意外部valid.foo.valid都丢失了。


是否有任何捷径替代上述选择器以获得相同的结果?

理想情况下我会使用类似的东西:

{ foo.bar }

最佳答案

不完全是一个捷径替代方案,但可以使用路径函数来实现此目的。这假设您事先知道路径的名称并知道它们存在

jq -n 'setpath( ["foo", "bar"] ; ( inputs | getpath(["foo", "bar"]) ) )'

setpath/2 函数设置第一个参数指示的指定路径上的值。路径的值是使用 getpath/1

从原始输入设置的

您可以使用 --argjson 将路径作为数组传递并直接使用它。

jq -n --argjson p '["foo", "bar"]' 'setpath( $p ; ( inputs | getpath($p) ) )'

关于json - 嵌套对象构造JQ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69362748/

相关文章:

json - 强制 jackson 映射器始终在 writeValue 上添加类类型而无需注释

javascript - 使用 Mustache 循环 json

javascript - 在对象的键值对中指定键时使用字符串

java - Json 和多个用户定义的对象错误

JavaScript 过滤数组和映射

jq - 使用 jq 按数组中的元素排序

json - 将 ps aux 转换为 json

json - WCF 无法反序列化 JSON 请求

php - 如何在单个查询中从用户名或城市中选择关键字

jq - 如何提取多个项目并将它们保存为一个 json 结构