如何基于VMID键匹配两份JSON输出并替换GRP_Members字段值
JSON匹配替换实现方案
核心逻辑是先构建VMID到VMName的快速映射表,再遍历分组数据批量替换成员值,全程无复杂逻辑,处理效率高。
实现步骤
- 预处理输入:先将两份JSON片段补全为合法JSON格式(原始片段缺外层数组包裹、部分字符串值缺引号、末尾存在冗余逗号,若数据源是接口/文件返回的标准JSON可跳过这步)
- 构建映射字典:遍历第一份VM数据,以VMID为键、对应VMName为值生成字典,后续匹配查询时间复杂度为O(1)
- 批量替换成员:遍历第二份分组数据,对每个分组下
GRP_Members数组内的所有VMID,从映射字典中取出对应VMName替换原值,未匹配到的VMID默认保留原值避免数据丢失 - 输出结果:按要求的结构导出处理后的分组数据即可
可直接运行的Python实现代码
import json # 第一份JSON:VMID与VMName映射关系 vm_list = [ { "VMID": "7283949-4658-3i93899-2bb1-36748", "VMName": "terra01-dc-domain" }, { "VMID": "833bjhds949-42658-3idbj46-2bb1-33bsj", "VMName": "terra02-dc-domain" } ] # 构建VMID->VMName映射表 vm_map = {item["VMID"]: item["VMName"] for item in vm_list} # 第二份JSON:分组与成员VMID关系 group_list = [ { "GroupName": "default.DC2-external-msw", "GRP_Members": [ "7283949-4658-3i93899-2bb1-36748" ] }, { "GroupName": "default.DC2-external-msw-svr2016-dns", "GRP_Members": [ "833bjhds949-42658-3idbj46-2bb1-33bsj" ] } ] # 执行替换 processed_group = [] for group in group_list: processed_group.append({ "GroupName": group["GroupName"], "GRP_Members": [vm_map.get(vmid, vmid) for vmid in group["GRP_Members"]] }) # 打印输出结果 print(json.dumps(processed_group, indent=4, ensure_ascii=False))
运行结果
注:你给出的预期输出样例中第二个分组的成员值存在笔误,按VMID映射关系应对应
terra02-dc-domain,实际运行输出如下:
[ { "GroupName": "default.DC2-external-msw", "GRP_Members": [ "terra01-dc-domain" ] }, { "GroupName": "default.DC2-external-msw-svr2016-dns", "GRP_Members": [ "terra02-dc-domain" ] } ]
适配说明
- 若
GRP_Members内存在多个VMID,现有逻辑无需修改即可支持批量替换 - 若数据源是本地JSON文件,可直接用
json.load(open('你的文件路径.json', 'r', encoding='utf-8'))读取替换代码里的硬编码数据部分 - 若需要对未匹配到VMID的条目做特殊标记,修改
vm_map.get(vmid, vmid)里的默认返回值即可
内容的提问来源于stack exchange,提问作者Palaniyappan PL
相关产品推荐
相关产品推荐

