如何解决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




