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

如何对比两个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)

核心逻辑步骤

  1. 将两个输入的数据按ID分组,用集合存储每个ID对应的所有值,方便快速比对和自动去重
  2. 分三类处理ID:两个输入共有的ID、Input2独有的ID、Input1独有的ID
  3. 对共有ID,先生成基础PATCH请求,若值完全匹配则追加带时间戳的PATCH请求
  4. 对独有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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 20:35:02