技术频道导航
HTML/CSS
.NET技术
IIS技术
PHP技术
Js/JQuery
Photoshop
Fireworks
服务器技术
操作系统
网站运营

赞助商

分类目录

赞助商

最新文章

搜索

【解决】json.decoder.JSONDecodeError: Extra data error

作者:admin    时间:2022-1-12 13:36:59    浏览:

当你尝试在 Python 中加载和解析包含多个 JSON 对象的 JSON 文件时,你如果收到一个错误:json.decoder.JSONDecodeError: Extra data error. 原因是 json.load()方法只能处理单个 JSON 对象。

 【解决】json.decoder.JSONDecodeError: Extra data error

如果文件包含多个 JSON 对象,则该文件无效。当你尝试加载和解析具有多个 JSON 对象的 JSON 文件时,每一行都包含有效的 JSON,但作为一个整体,它不是有效的 JSON,因为没有顶级列表或对象定义。只有当存在顶级列表或对象定义时,我们才能称 JSON 为有效 JSON。

例如,你想读取以下 JSON 文件,过滤一些数据,并将其存储到新的 JSON 文件中。

{"id": 1, "name": "json", "class": 8, "email": "[email protected]"}
{"id": 2, "name": "john", "class": 8, "email": "[email protected]"}
{"id": 3, "name": "josh", "class": 8, "email": "[email protected]"}
{"id": 4, "name": "emma", "class": 8, "email": "[email protected]"}

如果你的文件包含 JSON 对象列表,并且你想一次解码一个对象,我们可以做到。要加载和解析具有多个 JSON 对象的 JSON 文件,我们需要执行以下步骤:

  • 创建一个名为 jsonList 的空列表。
  • 逐行读取文件,因为每一行都包含有效的 JSON。即,一次读取一个 JSON 对象。
  • 使用 json.loads() 转换每个 JSON 对象为Python的dict
  • 将此字典保存到名为 jsonList 的列表中。

现在让我们看看这个例子。

import json

studentsList = []
print("Started Reading JSON file which contains multiple JSON document")
with open('students.txt') as f:
    for jsonObj in f:
        studentDict = json.loads(jsonObj)
        studentsList.append(studentDict)

print("Printing each JSON Decoded Object")
for student in studentsList:
    print(student["id"], student["name"], student["class"], student["email"])

输出:

Started Reading JSON file which contains multiple JSON document
Printing each JSON Decoded Object
1 json 8 [email protected]
2 john 8 [email protected]
3 josh 8 [email protected]
4 emma 8 [email protected]

由空格而不是行分隔的 json

如果我们有多个由空格而不是行分隔的 json,将如何实现这一点?代码如下:

import json

studentsList = []
print("Started Reading JSON file which contains multiple JSON document")
with open('students.txt') as f:
    braceCount = 0
    jsonStr = ''
    for jsonObj in f:
        braceCount += jsonObj.count('{')
        braceCount -= jsonObj.count('}')
        jsonStr += jsonObj
        if (braceCount == 0):
            studentDict = json.loads(jsonStr)
            studentsList.append(studentDict)
            jsonStr = ''

print("Printing each JSON Decoded Object")
for student in studentsList:
    print(student["id"], student["name"], student["class"], student["email"])

您可能对以下文章也感兴趣

标签: Python  
  • IT热文
  • 站长推荐