|
|
|
|
|
當(dāng)你嘗試在 Python 中加載和解析包含多個 JSON 對象的 JSON 文件時,你如果收到一個錯誤:json.decoder.JSONDecodeError: Extra data error. 原因是 json.load()
方法只能處理單個 JSON 對象。
如果文件包含多個 JSON 對象,則該文件無效。當(dāng)你嘗試加載和解析具有多個 JSON 對象的 JSON 文件時,每一行都包含有效的 JSON,但作為一個整體,它不是有效的 JSON,因為沒有頂級列表或?qū)ο蠖x。只有當(dāng)存在頂級列表或?qū)ο蠖x時,我們才能稱 JSON 為有效 JSON。
例如,你想讀取以下 JSON 文件,過濾一些數(shù)據(jù),并將其存儲到新的 JSON 文件中。
{"id": 1, "name": "json", "class": 8, "email": "json@webkaka.com"}
{"id": 2, "name": "john", "class": 8, "email": "jhon@webkaka.com"}
{"id": 3, "name": "josh", "class": 8, "email": "josh@webkaka.com"}
{"id": 4, "name": "emma", "class": 8, "email": "emma@webkaka.com"}
如果你的文件包含 JSON 對象列表,并且你想一次解碼一個對象,我們可以做到。要加載和解析具有多個 JSON 對象的 JSON 文件,我們需要執(zhí)行以下步驟:
json.loads()
轉(zhuǎn)換每個 JSON 對象為Python的dict
。現(xiàn)在讓我們看看這個例子。
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 json@webkaka.com
2 john 8 jhon@webkaka.com
3 josh 8 josh@webkaka.com
4 emma 8 emma@webkaka.com
由空格而不是行分隔的 json
如果我們有多個由空格而不是行分隔的 json,將如何實現(xiàn)這一點?代碼如下:
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"])