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

如何基于多个键(Key)去除JSON文件中的重复数据?

基于多键组合的JSON数据去重方案

嘿,我懂你遇到的情况——积分不够没法在原帖追问,特意开新帖问这个问题对吧?刚好Andy Hayden提到的那种「不是完全重复,但需要通过多个键的组合判断重复性」的场景,我平时处理得挺多,给你几个实用的解决方案:

首先得先把你的示例转成有效JSON格式(你提到原示例不是有效的,这是前提!JSON要求键名必须用双引号,结构要配对),假设你的数据长这样:

[
  {"obj_id": 123, "location": "NY", "name": "Alice"},
  {"obj_id": 456, "location": "LA", "name": "Bob"},
  {"obj_id": 123, "location": "NY", "name": "Alice Smith"},
  {"obj_id": 789, "location": "CHI", "name": "Charlie"},
  {"obj_id": 456, "location": "LA", "name": "Robert"}
]

这里我们就以obj_id + location的组合作为判断重复的依据,也就是只要这两个键的值都一样,就算是重复项,要去掉。


方案1:Python脚本(灵活可控)

如果你用Python处理,这是最灵活的方式,能自定义各种规则:

import json

# 读取JSON文件(替换成你的文件路径)
with open('your_data.json', 'r', encoding='utf-8') as f:
    raw_data = json.load(f)

# 定义用来判断重复的键列表,你可以随便加/改
unique_key_set = ['obj_id', 'location']
seen_combinations = set()
deduped_data = []

for item in raw_data:
    # 把多个键的组合转成可哈希的元组,存进集合里
    key_tuple = tuple(item[key] for key in unique_key_set)
    if key_tuple not in seen_combinations:
        seen_combinations.add(key_tuple)
        deduped_data.append(item)

# 把去重后的结果写回新文件
with open('deduped_data.json', 'w', encoding='utf-8') as f:
    json.dump(deduped_data, f, indent=2, ensure_ascii=False)

要是你想保留重复项里的最后一条,只需要先把原数组反转,去重后再反转回来就行,很灵活。


方案2:jq命令行工具(快速高效)

如果习惯用命令行处理,jq是处理JSON的神器,一行命令就能搞定:

# 保留每组重复中的第一个出现的项
jq 'unique_by(.obj_id, .location)' your_data.json > deduped_data.json

# 要是想保留最后一个,就先反转数组再去重,最后反转回来
jq 'reverse | unique_by(.obj_id, .location) | reverse' your_data.json > deduped_data.json

重要提醒

  • 一定要先确保你的JSON格式是有效的!比如键名加双引号、数组/对象括号配对,不然任何工具都没法正常工作。
  • 如果你的JSON文件特别大(比如好几GB),Python方案可以改成流式处理,不用一次性把所有数据加载到内存里,避免内存溢出。

内容的提问来源于stack exchange,提问作者Jbigger

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:28:08