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

基于jq实现JSON键值对解析与替换的方案问询

使用jq实现JSON键值映射替换

刚好我之前处理过类似的需求,咱们一步步来解决这个问题:

核心思路

  1. 先从你的映射JSON文件中提取出键值对映射表,把{"key1":"user1", "key2":"user2"}这类结构转换成一个统一的查找对象{"key1": "user1", "key2": "user2"}
  2. 用这个查找表去遍历目标JSON里的info.users数组,对每个元素进行匹配替换:存在映射就替换成对应值,不存在就保留原键

具体命令实现

假设你的映射文件叫map.json,目标文件叫data.json,可以用这条jq命令:

jq --argfile map map.json '
  # 第一步:从映射文件构建查找表
  ($map.users[] | to_entries[] | reduce . as $item ({}; .[$item.key] = $item.value)) as $lookup
  # 第二步:处理目标文件的users数组,替换匹配项
  | .info.users |= map($lookup[.] // .)
' data.json

逐部分解释

  • --argfile map map.json:把映射文件的内容读取到jq变量$map中
  • $map.users[] | to_entries[]:把映射里的users对象拆成一个个键值对条目(比如{"key":"key1", "value":"user1"})
  • reduce . as $item ({}; .[$item.key] = $item.value):把这些条目合并成一个单一的查找对象$lookup
  • .info.users |= map($lookup[.] // .):定位到目标文件的info.users数组,遍历每个元素:
    • $lookup[.]:查找当前元素对应的映射值
    • // .:如果找不到映射(返回null),就保留原元素

测试示例

map.json内容:

{ "users":[{ "key1":"user1", "key2":"user2" }] }

data.json内容:

{ "info": { "users":["key1","key2","key3","key4"] } }

运行命令后输出:

{
  "info": {
    "users": [
      "user1",
      "user2",
      "key3",
      "key4"
    ]
  }
}

为什么你之前的尝试可能没成功?

你提到用了slurpfile和walk,可能的问题是:

  • slurpfile会把文件内容放到数组里,需要用$maps[0]去取实际的JSON对象,而不是直接用$maps
  • walk是遍历整个JSON的所有节点,其实这里只需要处理特定的info.users数组,用map直接定位处理更精准,也更高效

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:20:16