如何基于多个键(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
相关产品推荐
相关产品推荐

