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

加载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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 09:17:48