Python导出含重复键JSON文件方法及重复键恢复方案咨询
在Python中导出含重复键的JSON及恢复重复键的方法
一、导出包含重复键的JSON文件
Python标准json模块序列化时会自动覆盖重复键,仅保留最后出现的键值对。要导出带重复键的JSON,可通过以下两种方式实现:
1. 自定义JSON编码器
重写json.JSONEncoder的encode方法,跳过默认去重逻辑,直接序列化所有键值对。建议用OrderedDict确保重复键的顺序:
import json from collections import OrderedDict class DuplicateKeyEncoder(json.JSONEncoder): def encode(self, obj): if isinstance(obj, OrderedDict): pairs = [f'"{k}": {self.encode(v)}' for k, v in obj.items()] return f"{{{', '.join(pairs)}}}" return super().encode(obj) # 示例:构造带重复键的有序数据 data = OrderedDict([ ("name", "Alice"), ("age", 25), ("name", "Bob") ]) # 导出文件 with open("duplicate_keys.json", "w", encoding="utf-8") as f: json.dump(data, f, cls=DuplicateKeyEncoder, indent=2)
2. 使用第三方库simplejson
simplejson支持直接序列化含重复键的有序字典,无需自定义编码器,更简便:
import simplejson as json from collections import OrderedDict data = OrderedDict([ ("id", 1), ("product", "Laptop"), ("id", 2) ]) with open("duplicate_simple.json", "w", encoding="utf-8") as f: json.dump(data, f, indent=2, sort_keys=False)
二、恢复重复键并导出(无需字符串编辑)
基于你保存的重复键索引文件,可按以下步骤还原并导出带重复键的JSON:
1. 加载处理后的数据与索引
先将带后缀键的JSON加载为OrderedDict(保留键的顺序),同时加载记录原键与后缀键映射的索引文件:
假设索引文件duplicate_index.json内容如下:
[ {"original_key": "name", "processed_key": "name_1"}, {"original_key": "id", "processed_key": "id_1"} ]
2. 构建带重复键的有序结构
遍历处理后的键值对,根据索引替换回原键名,重新构造包含重复键的有序键值对列表,再用自定义编码器导出:
import json from collections import OrderedDict # 加载处理后的JSON(保留顺序) with open("processed_data.json", "r", encoding="utf-8") as f: processed_data = json.load(f, object_pairs_hook=OrderedDict) # 加载重复键映射 with open("duplicate_index.json", "r", encoding="utf-8") as f: key_mapping = {item["processed_key"]: item["original_key"] for item in json.load(f)} # 还原原键名并构建有序键值对 restored_pairs = [] for key, value in processed_data.items(): restored_key = key_mapping.get(key, key) restored_pairs.append((restored_key, value)) # 转换为OrderedDict后导出 restored_data = OrderedDict(restored_pairs) with open("restored_duplicate.json", "w", encoding="utf-8") as f: json.dump(restored_data, f, cls=DuplicateKeyEncoder, indent=2)
核心注意事项
- 必须保留键的顺序:加载处理后的JSON时,务必使用
object_pairs_hook=OrderedDict,确保还原后的键顺序与原JSON一致。 - 索引文件需准确:索引必须完整记录所有后缀键对应的原键名,否则无法正确还原重复键。
内容的提问来源于stack exchange,提问作者user15555955
相关产品推荐
相关产品推荐

