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

如何高效替换深层嵌套JSON中的指定键以适配远程接口?

用jq批量替换固定位置JSON键的高效方案

既然键的位置固定,直接利用jq的路径定位+键重命名能力就能高效完成,不用递归遍历整个JSON结构,下面分两种场景给出具体实现:

场景1:需要替换的键数量较少

直接通过链式操作逐个处理每个固定路径的键,直观易懂:

假设你的origin.json结构如下:

{
  "user_info": {
    "local_name": "张三",
    "local_age": 25,
    "contact": {
      "local_phone": "138xxxxxx"
    }
  }
}

需要将local_name→remote_name、local_age→remote_age、local_phone→remote_phone,执行以下命令:

jq '
  .user_info.remote_name = .user_info.local_name |
  del(.user_info.local_name) |
  .user_info.remote_age = .user_info.local_age |
  del(.user_info.local_age) |
  .user_info.contact.remote_phone = .user_info.contact.local_phone |
  del(.user_info.contact.local_phone)
' origin.json > remote.json

逻辑很简单:先把原键的值赋值给新键,再删除原键,链式操作保证所有替换一次性完成。

场景2:需要替换的键数量较多

用reduce遍历预设的路径-键映射列表,可维护性更强,不用重复写赋值和删除逻辑:

同样基于上面的JSON结构,执行以下命令:

jq '
  reduce [
    {path: ["user_info", "local_name"], newKey: "remote_name"},
    {path: ["user_info", "local_age"], newKey: "remote_age"},
    {path: ["user_info", "contact", "local_phone"], newKey: "remote_phone"}
  ] as $item (.;
    setpath($item.path + [$item.newKey]; getpath($item.path)) |
    delpath($item.path)
  )
' origin.json > remote.json

关键逻辑解释:

  • reduce遍历映射列表,每次处理一个键的替换
  • getpath($item.path):通过路径获取原键的值
  • setpath($item.path + [$item.newKey]; ...):在原路径下创建新键并赋值
  • delpath($item.path):删除原键

注意事项

  1. 必须保证路径完全匹配固定位置,路径错误会导致替换失效
  2. 如果原键可能不存在,可在getpath后加?避免报错,比如getpath($item.path)?
  3. 针对大体积JSON,jq的流式处理机制不会占用过多内存,性能远优于手动遍历

内容的提问来源于stack exchange,提问作者Jia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 03:45:42