如何正确将多个字典写入JSON文件以避免解析报错
报错原因
标准JSON规范要求单个文件只能存在一个顶级JSON元素,你当前的写法是每次追加独立的JSON对象到文件末尾,导致一个文件内存在多个平级的顶级对象,解析器读取完第一个对象后遇到第二个对象的起始字符就会抛出语法错误。
解决方案
提供两种常用的合规实现方案,可根据使用场景选择:
方案1:存储为标准JSON数组(通用首选)
将所有字典存为一个JSON数组,每次写入前先读取已有数组内容,追加新元素后整体覆写文件,生成的是所有JSON解析器都支持的标准格式。
代码实现如下:
import json def somethin(a1,a2,a3): someDict = {"a": a1, "b": a2, "c": a3 } # 读取已有内容,文件不存在则初始化空数组 try: with open('somefile.json', 'r', encoding="utf-8") as f: data_list = json.load(f) except FileNotFoundError: data_list = [] # 追加新数据 data_list.append(someDict) # 整体写入文件 with open('somefile.json', 'w', encoding="utf-8") as f: json.dump(data_list, f, indent=4, ensure_ascii=False)
最终生成的文件格式示例:
[ { "a": 1, "b": 2, "c": 3 }, { "a": 1, "b": 2, "c": 3 } ]
方案2:存储为JSON Lines格式(高写入频率场景首选)
如果写入频率高、文件体积大,每次读全量内容性能损耗大,可以用行级JSON格式,要求每行存储一个独立的JSON对象,写入时新增换行符分隔即可,大部分大数据处理工具都原生支持该格式。
代码实现如下:
import json def somethin(a1,a2,a3): someDict = {"a": a1, "b": a2, "c": a3 } json_obj = json.dumps(someDict, ensure_ascii=False) # 追加写入时新增换行符分隔不同对象 with open('somefile.jsonl', 'a', encoding="utf-8") as f: f.write(json_obj + '\n')
解析时按行读取文件,逐行调用json.loads()解析每行内容即可。
内容的提问来源于stack exchange,提问作者AMM
相关产品推荐
相关产品推荐

