基于jq实现JSON键值对解析与替换的方案问询
使用jq实现JSON键值映射替换
刚好我之前处理过类似的需求,咱们一步步来解决这个问题:
核心思路
- 先从你的映射JSON文件中提取出键值对映射表,把
{"key1":"user1", "key2":"user2"}这类结构转换成一个统一的查找对象{"key1": "user1", "key2": "user2"} - 用这个查找表去遍历目标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对象,而不是直接用$mapswalk是遍历整个JSON的所有节点,其实这里只需要处理特定的info.users数组,用map直接定位处理更精准,也更高效
内容的提问来源于stack exchange,提问作者drk
相关产品推荐
相关产品推荐

