【问题标题】:Trying to read my .json data in python but keep getting an error试图在 python 中读取我的 .json 数据但不断收到错误
【发布时间】:2021-11-21 20:35:34
【问题描述】:

我有一个简单的代码,可以在 python 中读取我的 json 数据并转换为字典,这样我就可以将它用于 sqlite。但是,我一直遇到这个错误。

我运行的代码:

import json

with open("users.json", "r") as f:
    json_str = f.read()
    json_value = json.loads(json_str)
    print(type(json_value))

我有一组这样的数据:

{"_id":{"$od":"5f12"},"ready":true,"createdon":{"$date":1609687444800},"lastLogin":{"$date":1858},"position":"consumer","signUp":"Email","state":"WI"}
{"_id":{"$od":"5f12"},"ready":true,"createdon":{"$date":1609687444800},"lastLogin":{"$date":1858},"position":"consumer","signUp":"Email","state":"WI"}

我得到的错误:

    Traceback (most recent call last):
  File "json_to_sqlite.py", line 5, in <module>
    json_value = json.loads(json_str)
  File "/Users/malaba/opt/anaconda3/lib/python3.8/json/__init__.py", line 357, in loads
    return _default_decoder.decode(s)
  File "/Users/malaba/opt/anaconda3/lib/python3.8/json/decoder.py", line 340, in decode
    raise JSONDecodeError("Extra data", s, end)
json.decoder.JSONDecodeError: Extra data: line 2 column 1 (char 186)

【问题讨论】:

  • 字典之间需要一个逗号,然后你需要一个根元素,它可以是一个列表。所以我会用 [] 包装最终结果
  • 您不能将多个 JSON 字符串放入一个文件。如果要在 JSON 文件中放入多个对象,则应将它们写为数组。
  • @rv.kvetch 我不太明白你的意思。我知道我应该,但我刚开始,还在想办法。如果您能详细说明上面的评论,我将不胜感激。谢谢!
  • 嗯,我在手机上打字,所以有点难,但正如@barmer 上面所说,你需要一个数组作为根元素,例如 [{…}, {…}] - 注意这里每个元素都是一个字典。我想你明白我的意思。

标签: python json sqlite


【解决方案1】:

@rv.kvetch 是对的,问题是您的 users.json 文件有两个不同的 json 字符串,即您的文件中存储了两个字典,而您最多可以有一个字典。解决此问题的一种简单方法是将字典包装在一个列表中(因此,您有一个包含所有其他对象的 json 对象)。新格式化的users.json 文件看起来像这样:

[{"_id":{"$od":"5f12"},"ready":true,"createdon":{"$date":1609687444800},"lastLogin":{"$date":1858},"position":"consumer","signUp":"Email","state":"WI"},
{"_id":{"$od":"5f12"},"ready":true,"createdon":{"$date":1609687444800},"lastLogin":{"$date":1858},"position":"consumer","signUp":"Email","state":"WI"}]

请记下新文件中的左大括号和右大括号以及分隔字典的额外逗号。读取 json 文件的过程与以前相同,但如果您想从返回的 json 中提取特定字典,则需要相应地索引列表。有关json 模块的更多详细信息,请访问here

编辑:

如果您有一个大数据文件,这种操作手动执行是不可行的,因此您必须聪明地寻找文件的其他结构。例如,如果您知道文件中的每个字典都由换行符分隔并且文件中没有其他换行符(类似于您提供的示例),那么您可以自动执行此转换像这样:

import json

with open("users.json", "r") as f:
    new = [json.loads(x) for x in f.read().splitlines()]

with open("users.json", "w") as f:
    json.dump(new, f)

【讨论】:

  • 将字典转换为列表或数组的最佳方法是什么?
  • @malaba 只是为了明确一点,您不想将字典 convert 转换为数组,而是希望将它们 wrap 在数组中。您可以通过创建一个空列表并将每个字典手动附加到它来做到这一点。在我的解决方案中,我只是将文件中的两个字典放入一个列表中(注意添加的左大括号和右大括号以及字典之间的逗号)。
  • 我有一个大数据文件,除了手动之外还有什么办法吗?
  • @malaba 我编辑了我的答案,以便让您了解您可以对此做些什么,希望对您有所帮助。
猜你喜欢
  • 1970-01-01
  • 2020-01-21
  • 2019-03-31
  • 1970-01-01
  • 2021-02-28
  • 1970-01-01
  • 2020-11-18
  • 2019-04-27
  • 1970-01-01
相关资源
最近更新 更多