【发布时间】:2021-10-20 13:48:25
【问题描述】:
假设我有以下嵌套数据结构
cat nested.json
[
{
"a": "a",
"b": [
{"c": "c"}
]
},
{
"a": "a",
"b": [
{"c": "c"}
]
}
]
我可以这样压扁它
cat nested.json | jq '
[. as $in | reduce paths(scalars) as $path ({};
. + { ($path | map(tostring) | join(".")): $in | getpath($path) }
)]
' > flat.json
cat flat.json
[
{
"0.a": "a",
"0.b.0.c": "c",
"1.a": "a",
"1.b.0.c": "c"
}
]
要使用jq 反转展平操作,我尝试了这个
cat flat.json | jq '
.[0] | reduce to_entries[] as $kv ({};
setpath($kv.key|split("."); $kv.value)
)
'
{
"0": {
"a": "a",
"b": {
"0": {
"c": "c"
}
}
},
"1": {
"a": "a",
"b": {
"0": {
"c": "c"
}
}
}
}
但是,我想转换 setpath 参数中的数字以创建数组。这不太行,但我认为它很接近?
cat flat.json | jq '
def makePath($s): [split(".")[] | if (test("\\d+")) then tonumber else . end];
.[0] | reduce to_entries[] as $kv ({}; setpath(makePath($kv.key); $kv.value))
'
jq: error (at <stdin>:8): split input and separator must be strings
想要的输出与nested.json中的原始数据相同
【问题讨论】:
-
期望的输出是什么?可以更新吗?
-
请添加所需的输出,您的问题还不清楚。
-
想要的输出和nested.json中的原始数据一样
-
"想要的输出和nested.json中的原始数据是一样的"所以你根本不需要改变什么?现在更不清楚了..
-
@0stone0,从一开始就很清楚。
flat.json是输入,nested.json是所需的输出。