Python json.load JSONDecodeError:尝试加载多个 json 字典时出现额外数据错误

Posted

技术标签:

【中文标题】Python json.load JSONDecodeError:尝试加载多个 json 字典时出现额外数据错误【英文标题】:Python json.load JSONDecodeError: Extra data error when trying load multiple json dictionaries 【发布时间】:2021-08-26 15:44:42 【问题描述】:

所以我必须以如下所示的相同格式导入一个 json 文件:


    "name": "bob"


    "name": "sarah"

这是我试图用来打开它的函数:

def read_json_file(file):
    with open(file, "r") as r:
        response = json.load(r)
        return response

我在尝试加载时收到此错误:

json.decoder.JSONDecodeError:额外数据:第 4 行第 1 列(字符 22)

由于文件很大,我无法修复 json 数据。我需要一种解决方法来解析每个字典。

问这个问题的时候我已经试过了:

Python json.loads shows ValueError: Extra data

我尝试更改我的函数以匹配最佳答案:

    response = json.dumps(r)

然而这导致了这个错误:

TypeError:TextIOWrapper 类型的对象不是 JSON 可序列化的

对此的任何帮助将不胜感激。

【问题讨论】:

您给出的示例不是有效的 JSON @DarkKnight 我知道,但这是我收到的格式,文件太大无法更正,所以我需要解决方法 【参考方案1】:

为了解决那种“多重”/“无效”的JSON,你可以读取整个文件,添加这些括号[]来封装字符串,然后用json.loads()将其加载为字符串。

    以字符串形式读取整个文件,将其存储到变量中。 删除所有出现的换行符和空格。 在交集处添加逗号,,这样就变成了...,...。 用括号[]封装。 使用json.loads()解析JSON字符串。

完整代码:

def read_json_file(file):
    with open(file, "r") as r:
        response = r.read()
        response = response.replace('\n', '')
        response = response.replace('', ',')
        response = "[" + response + "]"
        return json.loads(response)

【讨论】:

这是我插入此函数时遇到的错误json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 2 column 1 (char 3) 对不起,我没有看清楚每个括号都放在一行中。已编辑我的答案 我不确定替换所有空格是个好主意。考虑 'name': 'John Smith' 行得通!我删除了替换空格,因为这不是我要查找的输出,但该函数的其余部分有效 @DarkKnight 感谢您的建议。我已经编辑了我的答案。【参考方案2】:

您可以使用JSONDecoder.raw_decode 以增量方式使用输入。这是一个基于source of decode()的示例:

def json_decode_many(s):
  import json
  import json.decoder
  decoder = json.JSONDecoder()
  _w = json.decoder.WHITESPACE.match

  idx = 0

  while True:
    idx = _w(s, idx).end() # skip leading whitespace
    if idx >= len(s):
      break
    obj, idx = decoder.raw_decode(s, idx=idx)
    yield obj

然后用法看起来像

>>> input_string = """

  "name": "bob"


  "name": "sarah"

"""
>>> for x in json_decode_many(input_string):
...   print("Decoded:", x)
...
Decoded: 'name': 'bob'
Decoded: 'name': 'sarah'

【讨论】:

以上是关于Python json.load JSONDecodeError:尝试加载多个 json 字典时出现额外数据错误的主要内容,如果未能解决你的问题,请参考以下文章

Python JSON dump ,load,dumps,loads

json.loads和json.load的区别

python中json.dumps()和json.dump() 以及 json.loads()和json.load()的区分

python中json文件处理涉及的四个函数json.dumps()和json.loads()json.dump()和json.load()的区分

Python json.load JSONDecodeError:尝试加载多个 json 字典时出现额外数据错误

Python中json文件处理的四个函数json.dumps()json.loads()json.dump()和json.load()的区分