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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 20:55:30