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

Python使用json.load/loads加载JSON文件报错求助

解决JSON加载的两个常见错误

嘿,我来帮你搞定这两个JSON加载的问题!先逐个分析你的错误,再给出可行的解决方案。

第一个错误:ValueError: Extra data

你用这段代码时出现了这个错误:

import json
with open('photos.json') as f:
    data = json.load(f)

原因

你的JSON文件是JSON Lines格式——也就是每行一个独立的JSON对象,但它不是标准的JSON数组(没有用[]包裹所有对象,也没有用逗号分隔它们)。json.load()要求整个文件是一个单一的合法JSON结构(比如一个数组或一个单独的对象),当它解析完第一个对象后,发现后面还有额外的内容,就会抛出这个错误。

看你提供的样本,确实是每行一个独立的{...}对象,没有被数组包裹,这就是问题所在。

第二个错误:TypeError: expected string or buffer

你用这段代码时出现了这个错误:

import json
with open('photos.json') as f:
    data = json.loads(f)

原因

json.loads()的参数必须是字符串、字节或字节数组,但你直接传入了文件对象f,它根本不是字符串类型,所以触发了类型错误。正确的用法是要么用json.load(f)(它会自动读取文件内容并解析),要么先把文件内容读成字符串再传给json.loads(),比如json.loads(f.read())——不过后者对于你的大文件来说,不仅会占用大量内存,还会回到第一个错误的问题。

最佳解决方案:逐行解析JSON Lines文件

既然你的文件是JSON Lines格式,而且看起来非常大(到20多万行),最高效的方式就是逐行读取并解析每个对象,这样既不会占用太多内存,也能避免上述两个错误。

用这段代码试试:

import json

data = []
with open('photos.json', 'r') as f:
    for line in f:
        # 跳过可能存在的空行
        stripped_line = line.strip()
        if stripped_line:
            data.append(json.loads(stripped_line))

代码说明

  • 我们逐行读取文件,每次只处理一行内容
  • 用strip()去掉每行的换行符和空白,跳过空行(避免解析空字符串报错)
  • 用json.loads()解析每行的单个JSON对象,然后添加到列表data中

如果你的文件特别大,不想把所有数据都存在内存里,也可以在循环里直接处理每个对象(比如写入数据库、做数据分析),而不是都存在data列表里。

备选方案:修改文件为标准JSON数组

如果你能修改原始文件,可以把它改成合法的JSON数组:

  1. 在文件开头添加[
  2. 在每个对象的末尾(除了最后一个)添加逗号
  3. 在文件末尾添加]

不过对于20多万行的文件来说,手动修改肯定不现实,你可以写个脚本批量处理,但逐行解析的方案显然更省心。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:13:22