使用jq反向还原已打平的嵌套数组 输出与原始结构完全一致
错误原因
你写的makePath函数中,split(".")没有指定操作对象,默认作用于当前上下文的输入,而不是你传入的$s参数,因此触发了类型错误。同时你还需要额外处理将全数字键的对象转换为数组的逻辑,因为setpath默认会为数字键生成对象结构而非数组。
正确实现代码
cat flat.json | jq ' # 将打平的key分割并把纯数字片段转换为数值类型 def makePath($s): $s | split(".")[] | if test("^\\d+$") then tonumber else . end; # 递归将全数字键的对象转换为数组 def obj2arr: if type == "object" then (reduce keys[] as $k (.; if $k | test("^\\d+$") then .[$k | tonumber] = .[$k] | del(.[$k]) else . end )) | if (keys | all(test("^\\d+$"))) then [.[]] else map_values(obj2arr) end else . end; # 遍历所有键值对构建结构,最后转换数组 .[0] | reduce to_entries[] as $kv ({}; setpath([makePath($kv.key)]; $kv.value)) | obj2arr '
输出结果
运行后得到的输出和原始的nested.json完全一致:
[ { "a": "a", "b": [ { "c": "c" } ] }, { "a": "a", "b": [ { "c": "c" } ] } ]
内容的提问来源于stack exchange,提问作者mozey
相关产品推荐
相关产品推荐

