【问题标题】:jq: Create JSON Object from flat keysjq:从平面键创建 JSON 对象
【发布时间】:2021-02-12 04:30:07
【问题描述】:

如何使用 jq 从对象中的平面键创建嵌套的 JSON 对象?

我的意见是

{
    "foo.bar": "lorem",
    "foo.baz": "ipsum",
    "bar.foo": "dolor"
}

输出应该是这样的

{
    "foo": {
        "bar": "lorem",
        "baz": "ipsum"
    },
    "bar": {
        "foo": "dolor"
    }
}

【问题讨论】:

    标签: json object key jq


    【解决方案1】:

    一种方法是使用reducesetpath 从原始键构建新对象:

    $ jq '. as $orig | reduce keys[] as $key ({}; setpath($key | split("."); $orig[$key]))' input.json
    {
      "bar": {
        "foo": "dolor"
      },
      "foo": {
        "bar": "lorem",
        "baz": "ipsum"
      }
    }
    

    它是如何工作的

    reduce 每个键调用一次其主体中的表达式。第一次,. 被设置为一个空对象,每次都是前一个调用的主体返回的内容。每次调用都会将当前键拆分为一个数组,setpath 将其用作在 . 中设置的路径,并使用原始对象中的相应值。

    所以结果是一次一个元素逐渐建立起来的:

    . = {}$key = "foo.bar" -> . = {"foo":{"bar":"lorem"}}$key = "foo.baz" 等等。

    【讨论】:

      猜你喜欢
      • 2019-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多