我正在尝试将数据从 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/