Python如何对比无顺序不同长度的两个JSON并完成数据更新删除操作
问题场景
现有两个无需考虑顺序的JSON数组,二者条目顺序不同但存在ID相同的条目,示例如下:
第一个JSON:
[ {'Id': 113, 'Label': 'Z', 'Input': 'Z', 'Updated': False}, {'Id': 124, 'Label': ' X', 'Input': ' X', 'Updated': False}, {'Id': 128, 'Label': ' C', 'Input': ' C', 'Updated': False}, {'Id': 117, 'Label': ' R', 'Input': ' R', 'Updated': False}, {'Id': 118, 'Label': ' T', 'Input': ' T', 'Updated': False} ]
第二个JSON:
[ {'Id': 128, 'Label': ' C1', 'Input': ' C1', 'Updated': False}, {'Id': 118, 'Label': ' T1', 'Input': ' T1', 'Updated': False}, {'Id': 113, 'Label': 'Z2', 'Input': 'Z2', 'Updated': False} ]
核心需求:
- 用第二个JSON中ID相同的条目更新第一个JSON的对应数据
- 第一个JSON中第二个JSON不存在对应ID的条目标记为删除
- 支持处理第二个JSON中Id=0的新增条目
原有嵌套循环的代码仅能处理顺序一致的JSON列表,无法适配接口返回的乱序列表现状。
优化方案
核心思路是把第二个JSON转换为以ID为键的字典,完全消除顺序对匹配逻辑的影响,同时把时间复杂度从原来的O(n*m)降到O(n+m),逻辑也更清晰。
优化后代码示例
# 第一步:预处理第二个JSON,拆分ID映射字典和新增条目 json_id_map = {} new_items = [] for jsonItem in getJson: if jsonItem['Id'] == 0: new_items.append(jsonItem) else: json_id_map[jsonItem['Id']] = jsonItem # 第二步:遍历第一个列表的所有条目,直接通过ID匹配处理 for form in selectedUserForm: if form.isUpdated: continue # ID存在则更新字段 if form.id in json_id_map: matched_item = json_id_map.pop(form.id) form.metaKey = matched_item['Label'] form.metaVal = matched_item['Input'] form.isUpdated = True form.save() # ID不存在则标记删除 else: form.isDeleted = True form.isUpdated = True form.save() # 第三步:批量处理Id=0的新增条目 for new_item in new_items: newMeta = UserMeta( user = selectedUser, metaVal = new_item['Input'].title(), metaKey = new_item['Label'].title(), isUpdated = True ) newMeta.full_clean() newMeta.save()
优化说明
- 字典查找效率为O(1),完全不受JSON列表顺序影响,匹配准确率100%
- 避免了双重嵌套循环,不会出现原逻辑中遍历到非匹配条目就错误标记删除的问题
- 预处理阶段拆分更新和新增逻辑,代码解耦后更容易调试和维护
内容的提问来源于stack exchange,提问作者nogabemist
相关产品推荐
相关产品推荐

