You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 01:45:03