如何对比两个JSON并按ID分组生成符合规则的请求输出?
数据同步请求生成逻辑实现方案
核心需求
- 按Input1中的ID对数据进行分组
- 若Input1的ID在Input2中存在:按ID分组,将Input1和Input2中该ID对应的所有值用分号
;拼接,生成PATCH请求 - 若Input2的ID在Input1中不存在:按ID分组,将该ID对应的值用分号
;拼接,生成POST请求 - 若Input1的ID在Input2中不存在:按ID分组,将该ID对应的值用分号
;拼接,生成DELETE请求 - 若Input1与Input2中同一ID的所有值完全匹配(去重后集合相等),额外生成一条带当前时间戳的PATCH请求
输入输出示例
输入1(Input1)
{ "prod": [ { "Id": "123456", "value": "ABC" }, { "Id": "123456", "value": "DEF" }, { "Id": "56789", "value": "ABC" }, { "Id": "56789", "value": "DEF" }, { "Id": "987654", "value": "DEF" } ] }
输入2(Input2)
{ "ProdInfo": { "Prod": [ { "Id": "123456", "value1": "LMN" }, { "Id": "123456", "value1": "OPQ" }, { "Id": "56789", "value1": "ABC" }, { "Id": "56789", "value1": "DEF" }, { "Id": "654321", "value1": "OPQ" } ] } }
期望输出
{ "output": [ { "Request": [ { "method": "PATCH", "body": { "ID": "123456", "Value": "ABC;DEF;LMN;OPQ" } }, { "method": "PATCH", "body": { "ID": "56789", "Value": "ABC;DEF", "CurrentTime": "now()" } }, { "method": "POST", "body": { "ID": "654321", "Value": "OPQ" } }, { "method": "DELETE", "body": { "ID": "987654", "Value": "DEF" } } ] } ] }
实现思路与代码(Python)
核心逻辑步骤
- 将两个输入的数据按ID分组,用集合存储每个ID对应的所有值,方便快速比对和自动去重
- 分三类处理ID:两个输入共有的ID、Input2独有的ID、Input1独有的ID
- 对共有ID,先生成基础PATCH请求,若值完全匹配则追加带时间戳的PATCH请求
- 对独有ID分别生成POST/DELETE请求
完整代码
import time import json def group_by_id(data_list, value_key): """按ID分组,返回{id: {value1, value2,...}}的字典,自动去重""" result = {} for item in data_list: item_id = item["Id"] value = item[value_key] if item_id not in result: result[item_id] = set() result[item_id].add(value) return result # 输入数据(实际使用时可替换为读取文件/接口返回数据) input1 = { "prod": [ {"Id": "123456", "value": "ABC"}, {"Id": "123456", "value": "DEF"}, {"Id": "56789", "value": "ABC"}, {"Id": "56789", "value": "DEF"}, {"Id": "987654", "value": "DEF"} ] } input2 = { "ProdInfo": { "Prod": [ {"Id": "123456", "value1": "LMN"}, {"Id": "123456", "value1": "OPQ"}, {"Id": "56789", "value1": "ABC"}, {"Id": "56789", "value1": "DEF"}, {"Id": "654321", "value1": "OPQ"} ] } } # 分组处理数据 group1 = group_by_id(input1["prod"], "value") group2 = group_by_id(input2["ProdInfo"]["Prod"], "value1") requests = [] # 处理共有的ID:生成PATCH请求,若值完全匹配则追加带时间戳的PATCH common_ids = set(group1.keys()) & set(group2.keys()) for id in common_ids: vals1 = group1[id] vals2 = group2[id] # 拼接所有值 all_vals = ";".join(vals1.union(vals2)) base_patch = { "method": "PATCH", "body": { "ID": id, "Value": all_vals } } requests.append(base_patch) # 值完全匹配时添加时间戳请求 if vals1 == vals2: current_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) timestamp_patch = { "method": "PATCH", "body": { "ID": id, "Value": ";".join(vals1), "CurrentTime": current_time } } requests.append(timestamp_patch) # 处理Input2独有的ID:生成POST请求 input2_only_ids = set(group2.keys()) - set(group1.keys()) for id in input2_only_ids: post_req = { "method": "POST", "body": { "ID": id, "Value": ";".join(group2[id]) } } requests.append(post_req) # 处理Input1独有的ID:生成DELETE请求 input1_only_ids = set(group1.keys()) - set(group2.keys()) for id in input1_only_ids: delete_req = { "method": "DELETE", "body": { "ID": id, "Value": ";".join(group1[id]) } } requests.append(delete_req) # 组装最终输出 output = { "output": [ { "Request": requests } ] } # 打印结果,可根据需求改为写入文件或返回给接口 print(json.dumps(output, indent=2, ensure_ascii=False))
代码说明
- 用集合存储值,既自动去重,又能直接通过
==判断两个ID的所有值是否完全匹配 - 分模块处理不同类型的ID,逻辑清晰易维护
- 时间戳使用系统当前时间格式化生成,符合业务需求中的
now()含义
内容的提问来源于stack exchange,提问作者user21364983
相关产品推荐
相关产品推荐

