加载JSON文件遇JSONDecodeError,请求排查格式问题及解决方法
解决JSONDecodeError:多个独立JSON对象引发的解析失败
看起来你遇到的JSONDecodeError根源很明确——你的data.json文件里包含了多个独立的JSON对象,而标准JSON格式要求整个文件只能有一个顶级结构(要么是单个对象{},要么是一个数组[])。咱们一步步来解决这个问题:
问题原因分析
先看你提供的JSON示例数据:
{ "12345678901234567": { "Process Status": 0, "Process": "fittingspa" } } { "12345678901234567": { "Process Status": 0, "Process": "aprocess" } } { "12345678901234567": { "Process Status": 1, "Process": "Development" } }
这是三个完全独立的JSON对象,彼此没有包裹在数组里,也没有合并成一个单一对象。json.load()只能解析一个完整的JSON结构,所以遇到第二个{就会触发解码错误。
另外,你的写入代码用了'w'模式(覆盖写入),如果是多次运行这段代码,每次都会写入一个单独的对象到文件里,最终就会形成这种多对象的非法JSON文件。
解决方案
1. 修改写入代码,生成合法的JSON格式
根据你的需求,有两种合理的选择:
选项A:将所有数据存入一个JSON数组(推荐,适合保留多条重复键的记录)
如果需要保留所有记录(包括重复键的条目),应该把每个对象加入到一个列表中,最终写入数组:
import json # 假设你是从存储过程获取多条result记录 results = [...] # 这里替换为你的实际结果集 # 初始化一个列表来存储所有数据 data = [] for result in results: item = { result.NUM: { 'Process': result.Rev, 'Process Status': result.StatusID } } data.append(item) # 写入文件,此时整个文件是一个合法的JSON数组 with open('data.json', 'w') as outfile: json.dump(data, outfile, indent=4, sort_keys=True, ensure_ascii=False)
生成的JSON会是这样的合法格式:
[ { "12345678901234567": { "Process Status": 0, "Process": "fittingspa" } }, { "12345678901234567": { "Process Status": 0, "Process": "aprocess" } }, { "12345678901234567": { "Process Status": 1, "Process": "Development" } } ]
选项B:合并为单一JSON对象(适合键唯一,覆盖重复键的情况)
如果result.NUM是唯一标识,你可以把所有数据合并到一个字典里,重复的键会被最后一次的记录覆盖:
import json results = [...] # 你的结果集 # 初始化一个字典 data = {} for result in results: # 直接将键值对加入字典,重复键会覆盖之前的值 data[result.NUM] = { 'Process': result.Rev, 'Process Status': result.StatusID } with open('data.json', 'w') as outfile: json.dump(data, outfile, indent=4, sort_keys=True, ensure_ascii=False)
生成的JSON是单一对象(注意重复键会被覆盖,最终只有最后一条记录保留):
{ "12345678901234567": { "Process Status": 1, "Process": "Development" } }
2. 修复现有的非法JSON文件
如果你已经有了那个包含多个对象的data.json,可以手动或者用代码转换成合法格式:
- 手动修复:在文件最开头加
[,结尾加],然后在每个对象之间加上逗号。 - 代码修复:读取文件内容,用正则替换处理成数组:
import json import re with open('data.json', 'r') as f: content = f.read() # 替换独立的对象分隔符,包裹成数组 fixed_content = re.sub(r'}\s*{', '}, {', content) fixed_json = f'[{fixed_content}]' # 解析并重新格式化 data = json.loads(fixed_json) with open('fixed_data.json', 'w') as f: json.dump(data, f, indent=4, ensure_ascii=False)
3. 验证修复后的JSON
你可以直接用你的加载代码测试,现在应该能正常解析并打印数据了;也可以复制JSON内容到浏览器控制台,用JSON.parse()验证格式合法性。
内容的提问来源于stack exchange,提问作者EcSync
相关产品推荐
相关产品推荐

