You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何解决json.decoder.JSONDecodeError?为何Python代码仅首次运行正常?

解决Python json.load第二次执行触发JSONDecodeError的问题

你遇到的这个报错,核心原因其实很简单:你用了追加模式('a')写入JSON文件,导致文件里存在多个独立的JSON结构,而json.load()只能解析单个完整的JSON对象

具体分析

第一次运行代码后,test.json里的内容是一个合法的JSON对象:

{"test_device": [{"device": "gas_zaehler", "measure": "energy", "value": 1}]}

但第二次运行时,你用'a'模式打开文件,把新的JSON对象追加到了文件末尾,此时文件内容变成了两个独立的JSON对象:

{"test_device": [{"device": "gas_zaehler", "measure": "energy", "value": 1}]}
{"test_device": [{"device": "gas_zaehler", "measure": "energy", "value": 1}]}

这种格式不符合标准JSON的要求(标准JSON只能有一个顶层对象或数组),所以json.load()读取时会直接抛出"Extra data"错误——它不知道如何处理两个并列的JSON结构。

两种解决方案

根据你的需求,有两种处理方式:

方案1:追加数据到同一个JSON结构(推荐,适合累积数据)

如果你的目标是往同一个test_device列表里添加新条目,应该先读取现有文件的内容,追加数据后再覆盖写入:

import json
import os

counter_value = 1
filename = 'test.json'

# 初始化或读取现有数据
if os.path.exists(filename):
    with open(filename, 'r') as feedjson:
        data = json.load(feedjson)
else:
    data = {'test_device': []}

# 添加新数据
data['test_device'].append({
    "device": "gas_zaehler",
    "measure": "energy",
    "value": counter_value
})

# 覆盖写入完整的JSON结构
with open(filename, 'w') as feedjson:
    json.dump(data, feedjson)

这样每次运行后,文件里始终是一个完整的JSON对象,json.load()就能正常解析了。

方案2:使用JSON Lines格式(适合每行一个独立JSON)

如果你确实需要保留每行一个JSON对象的格式(也就是JSON Lines规范),那读取时要逐行解析,而不是用json.load()一次性读取整个文件:

with open('test.json') as feedjson:
    for line in feedjson:
        # 逐行解析单个JSON对象
        json_data = json.loads(line.strip())
        for i in json_data['test_device']:
            print("device" + i['device'])

这种方式下,每个JSON对象单独占一行,读取时逐行处理就能避免报错。

补充说明

你提到这个问题和另一个常见场景不同,但本质都是文件中存在多个独立的JSON对象——json.load()本身不支持解析这种多对象的文件,要么把所有数据整合到一个顶层JSON结构里,要么改用逐行解析的方式。

内容的提问来源于stack exchange,提问作者AhmyOhlin

火山引擎 最新活动