json - 使用 jq 将字符串拆分为嵌套对象

标签 json jq

我正在尝试将数据从 consul kv 导出到 json 中,其中包含 consul 中每个深度级别的嵌套对象。

从领事返回的示例 json:

[
  {
    "LockIndex": 0,
    "Key": "foobar/testing",
    "Flags": 0,
    "Value": "xxxxx",
    "CreateIndex": 833,
    "ModifyIndex": 833
  },
  {
    "LockIndex": 0,
    "Key": "foobar/bazbar",
    "Flags": 0,
    "Value": "xxxxx",
    "CreateIndex": 833,
    "ModifyIndex": 833
  }
]

所需的 JSON:
[
  {
    "foobar": {
      "testing": "xxxxx",
      "bazbar": "xxxxx"
    }
  }
]

我有点接近 jq '.[] | objects | {Key: .Key | split("/"), Value: .Value}'但我只是不明白如何基于 .Key 的 split() 进行递归并创建嵌套对象。我想我还需要 sort_by(.Key) 来处理乱序数据,除非我可以 | add任意并让 jq 解析结构。

我意识到xxxxx是 base64 编码的,希望是 base64d很快就会合并,但在那之前我想我可以用 shell 后处理来解码它。

最佳答案

以下内容在您提供的特定情况下生成感兴趣的 JSON 对象,但也提供了一个合理的概括,以防有多个“foobar”前缀:

map( . as $o | .Key | split("/") | {(.[0]): {(.[1]): ($o|.Value) }} )
| reduce .[] as $o
    ( {};
      ($o|keys[0]) as $key | . + { ($key): (.[$key] + $o[$key]) } )

输出:
{
  "foobar": {
    "testing": "xxxxx",
    "bazbar": "xxxxx"
  }
}

关于json - 使用 jq 将字符串拆分为嵌套对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36146782/

相关文章:

json - 如何遍历文件目录并使用 jq 和 shell 脚本保存到新文件?

json - jq:选择并删除嵌套字段

java - 如何在自定义 getter 中序列化 JSON 对象?

json - 在 MATLAB 中从 REST Web 服务读取内容

iphone - iPhone 应用程序后端示例

asp.net - 我可以在 web.config 中为 maxJsonLength 设置无限长度吗?

bash - 在 bash 中将数组变量传递给 jq

Windows 等效于 Linux JQ 工具命令

windows - 简单的 jq 过滤器在 Windows shell 中不起作用,各种引用问题

java - 如何解码 JSONObject