Python读写JSON及修改值时如何保留原始结构?
在Python中读写/修改JSON时保留原始结构的方法
嘿,这个问题我之前踩过不少坑,尤其是当需要严格保留JSON原始排版和键顺序的时候,确实得注意一些细节。下面分场景给你讲清楚怎么处理:
一、读取JSON时保留原始结构
1. 仅需保留键的顺序(Python 3.7+)
从Python 3.7开始,内置的dict类型就是插入有序的了,所以直接用标准库的json.load()就能保留原始JSON的键顺序:
import json with open("your_file.json", "r", encoding="utf-8") as f: json_data = json.load(f)
2. 低版本Python或强顺序保证
如果你的Python版本低于3.7,或者需要更严格的顺序约束,可以用collections.OrderedDict作为object_pairs_hook参数:
from collections import OrderedDict import json with open("your_file.json", "r", encoding="utf-8") as f: json_data = json.load(f, object_pairs_hook=OrderedDict)
3. 保留完整格式细节(缩进、空行、注释)
标准库的json模块没法处理原始JSON里的注释(尽管标准JSON不允许,但很多实际场景会用到),也没法复刻原始的缩进、空行排版。这时候推荐用第三方库ruamel.json,它专门为“保留原始格式”设计:
from ruamel.json import YAML # 初始化时指定typ='json',表示处理JSON格式 yaml = YAML(typ='json') yaml.preserve_quotes = True # 保留原始的引号类型(单/双引号) with open("your_file.json", "r", encoding="utf-8") as f: json_data = yaml.load(f)
二、写入JSON时维持原始结构
1. 标准库实现
用json.dump()时,记住两个关键参数就能避免打乱结构:
sort_keys=False:默认就是False,千万别改成True,否则会把键按字母排序,彻底打乱原始顺序indent:手动指定和原始JSON一致的缩进数(比如原始用4空格缩进,就传indent=4),还可以用separators=(',', ': ')匹配原始的分隔符格式
示例代码:
import json # 读取数据 with open("your_file.json", "r", encoding="utf-8") as f: json_data = json.load(f) # 修改某个值 json_data["target_key"] = "new_value" # 写入时保留结构 with open("modified_file.json", "w", encoding="utf-8") as f: json.dump( json_data, f, indent=4, # 和原始缩进一致 ensure_ascii=False, # 保留中文等非ASCII字符 sort_keys=False # 不排序键 )
2. ruamel.json实现(自动保留格式)
用ruamel.json的话就省心多了,它会自动记录原始的格式信息,修改后直接dump即可,不用手动设置缩进、排序等参数:
from ruamel.json import YAML yaml = YAML(typ='json') yaml.preserve_quotes = True # 读取数据 with open("your_file.json", "r", encoding="utf-8") as f: json_data = yaml.load(f) # 修改值 json_data["target_key"] = "new_value" # 写入,自动保留原始格式 with open("modified_file.json", "w", encoding="utf-8") as f: yaml.dump(json_data, f)
三、修改JSON值时维持原始结构的核心原则
- 尽量不破坏原有数据结构:修改时只改动目标值,不要随意新增/删除键(如果必须增删,标准库会按插入顺序排列,ruamel.json会自动适配格式)
- 匹配原始格式参数:用标准库时,务必保证
dump的缩进、排序参数和原始JSON一致 - 复杂场景用专业库:如果原始JSON有特殊排版(比如数组换行、空行)或注释,直接用
ruamel.json,避免自己手动适配格式的麻烦
内容的提问来源于stack exchange,提问作者Hugh Nash
相关产品推荐
相关产品推荐

