您好,登錄后才能下訂單哦!
這篇文章主要講解了“Python錯誤JSONDecodeError: Expecting value: line 1 column 1怎么解決”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Python錯誤JSONDecodeError: Expecting value: line 1 column 1怎么解決”吧!
Python“json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0) ”發(fā)生在我們試圖解析一些無效的 JSON 時(shí)。
要解決該錯誤,請確保響應(yīng)或文件不為空,或者在解析之前有條件地檢查內(nèi)容類型。
這是一個非常簡單的示例,說明錯誤是如何發(fā)生的。
import json # ?? json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0) result = json.loads('')
我們試圖將一個空字符串當(dāng)作有效的 JSON 來解析。
最常見的錯誤原因是:
嘗試解析無效的 JSON 值(例如單引號或尾隨逗號)。
從遠(yuǎn)程服務(wù)器(例如 204 或 404)獲取空響應(yīng)并嘗試將其作為 JSON 進(jìn)行解析。
嘗試像解析 JSON 一樣解析具有不同內(nèi)容類型(例如文本/html)的響應(yīng)。
嘗試錯誤地讀取 JSON 文件或嘗試解析空 JSON 文件的內(nèi)容。
下面是一個存儲無效 JSON 的文件示例。
example.json
{ "id": 1, 'name': "Alice", "age": 30, "country": "Austria" }
請注意
,名稱屬性用單引號引起來。
這會使 JSON 無效,并且嘗試從文件中讀取會導(dǎo)致錯誤。
import json file_name = 'example.json' # ?? json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 3 column 3 (char 15) with open(file_name, 'r', encoding='utf-8') as f: my_data = json.load(f) print(my_data)
要解決該錯誤,需要確保將 JSON 中的所有鍵和字符串值用雙引號引起來。
example.json
{ "id": 1, "name": "Alice", "age": 30, "country": "Austria" }
現(xiàn)在 name 鍵用雙引號括起來,我們可以安全地從文件中讀取。
# ? works as expected import json file_name = 'example.json' with open(file_name, 'r', encoding='utf-8') as f: my_data = json.load(f) # ????? {'id': 1, 'name': 'Alice', 'age': 30, 'country': 'Austria'} print(my_data) print(my_data['name']) # ????? Alice
確保在打開文件時(shí)設(shè)置編碼關(guān)鍵字參數(shù)(如上面的代碼示例所示)。
以下是無效和有效 JSON 值的一些示例。
example.json
// ?? 無效的 JSON(忘記引用屬性) { "name": "Alice", age: 30 }
對象中的 age 屬性未用雙引號引起來,這使得 JSON 無效。
example.json
// ? 有效的 JSON(所有屬性都用雙引號引起來) { "name": "Alice", "age": 30 }
示例中的 JSON 是有效的,因?yàn)樗袑傩院妥址刀加秒p引號引起來。
確保沒有屬性或字符串值用單引號引起來。
example.json
// ?? 無效的 JSON(用單引號引起來的名稱屬性) { 'name': "Alice", "age": 30 }
示例中的名稱屬性用單引號引起來,這使得 JSON 無效。
永遠(yuǎn)不要在 JSON 中使用單引號。 屬性名稱和字符串值必須用雙引號引起來。
example.json
// ? 有效的 JSON(屬性名稱和值用雙引號引起來) { "name": "Alice", "age": 30 }
在數(shù)組的最后一個元素或最后一個鍵值對之后有尾隨逗號會使我們的 JSON 無效。
example.json
// ?? 無效的 JSON(最后一個屬性后的尾隨逗號) { "name": "Alice", "age": 30, ????? 這個逗號使它無效 JSON }
請注意
,在 age 屬性之后有一個尾隨逗號。
這會使 JSON 無效,因?yàn)椴辉试S使用尾隨逗號。
要解決該錯誤,請確保刪除所有結(jié)尾的逗號。
example.json
// ? 有效的 JSON(沒有尾隨逗號) { "name": "Alice", "age": 30 }
如果我們在發(fā)出 API 請求時(shí)遇到錯誤,請確保響應(yīng)在解析之前具有 application/json
內(nèi)容類型標(biāo)頭。
import requests def make_request(): response = requests.delete('https://example.com/api/users/2') print('response: ?????', response) # response: ????? <Response [204]> print('response.text: ?????', response.text) # response.text: ????? "" # response.status_code: ????? 204 print('response.status_code: ?????', response.status_code) print('response.headers: ?????', response.headers) if (response.status_code != 204 and 'content-type' in response.headers and 'application/json' in response.headers['content-type']): parsed = response.json() print('? parsed response: ?????', parsed) else: # ????? this runs print('?? conditions not met') make_request()
該示例使用 requests
包并發(fā)出 HTTP DELETE
請求,該請求返回 204 狀態(tài)(無內(nèi)容)。
嘗試像解析 JSON 一樣解析空響應(yīng)會引發(fā) JSONDecodeError
,因此我們必須檢查:
響應(yīng)狀態(tài)不是 204(無內(nèi)容)。
響應(yīng)頭字典有一個內(nèi)容類型鍵。
內(nèi)容類型鍵的值為 application/json
。
這樣我們就可以確定服務(wù)器在嘗試使用 reponse.json()
方法(如果使用請求)或 json.loads(my_json_str)
解析它之前向我們發(fā)送了一個有效的 JSON 響應(yīng)。
如果服務(wù)器向我們發(fā)送了一個空響應(yīng)或響應(yīng)不是 application/json
類型,我們將收到 JSONDecodeError
。
我們不能嘗試像解析 JSON 一樣解析 text/html
或 XML 響應(yīng)(或空響應(yīng))。
該錯誤通常是在以下情況下引起的:
試圖錯誤地讀取 JSON 文件。
嘗試讀取一個空的 JSON 文件。
嘗試讀取包含無效 JSON 的 JSON 文件。
我們可以使用 json.load()
方法將 JSON 文件反序列化為 Python 對象。
import json file_name = 'example.json' with open(file_name, 'r', encoding='utf-8') as f: my_data = json.load(f) # ????? 使用 load() 解析 JSON print(my_data) # ????? {'name': 'Alice', 'age': 30}
該示例假定在同一目錄中有一個名為 example.json 的文件。
example.json
{"name": "Alice", "age": 30}
確保我們正在讀取的文件不為空,因?yàn)檫@通常會導(dǎo)致錯誤。
如果我們的文件可能包含無效的 JSON,請使用 try/except
語句來處理錯誤。
假設(shè)我們有以下 JSON 文件。
example.json
{ "name": "Alice", 'age': 30 }
請注意,age 屬性是單引號的,這使得 JSON 無效。
下面是我們?nèi)绾问褂?try/except
語句來處理錯誤。
import json file_name = 'example.json' with open(file_name, 'r', encoding='utf-8') as f: try: my_data = json.load(f) # ????? 使用 load() 解析 JSON print(my_data) except BaseException as e: print('The file contains invalid JSON')
我們嘗試從文件中解析 JSON 數(shù)據(jù),但文件包含無效的 JSON,因此引發(fā)異常,然后在 except 塊中處理。
錯誤的另一個常見原因是在嘗試從 JSON 文件讀取時(shí)將文件路徑傳遞給 json.loads()
方法。
import json file_name = 'example.json' with open(file_name, 'r', encoding='utf-8') as f: # ?? json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0) my_data = json.loads(file_name) # ????? incorrectly passed file path print(my_data) # ????? {'name': 'Alice', 'age': 30}
json.load
方法用于將文件反序列化為 Python 對象,而 json.loads
方法用于將 JSON 字符串反序列化為 Python 對象。
import json file_name = 'example.json' with open(file_name, 'r', encoding='utf-8') as f: my_data = json.load(f) # ? 將文件對象傳遞給 json.load() print(my_data) # ????? {'name': 'Alice', 'age': 30}
json.load()
方法需要一個包含實(shí)現(xiàn).read()
方法的 JSON 文檔的文本文件或二進(jìn)制文件。
或者,我們可以手動調(diào)用文件對象的 read()
方法并使用 json.loads()
方法。
import json file_name = 'example.json' with open(file_name, 'r', encoding='utf-8') as f: # ????? 確保調(diào)用 read() my_data = json.loads(f.read()) print(my_data) # ????? {'name': 'Alice', 'age': 30} print(type(my_data)) # ????? <class 'dict'>
上面的示例實(shí)現(xiàn)了相同的結(jié)果,但是我們沒有依賴 json.load() 方法為我們調(diào)用文件對象上的 read() ,而是手動執(zhí)行它并使用 json.loads() 方法。
json.loads()
方法基本上幫助我們從 JSON 字符串加載 Python 本機(jī)對象(例如字典或列表)。
如果我們需要在使用 json.loads()
方法之前使您的 JSON 有效,我們可以嘗試使用 str.replace()
方法。
下面是一個示例 JSON 文件,其中包含使 JSON 無效的單引號屬性。
example.json
{ "name": "Alice", 'age': 30 }
下面是我們?nèi)绾问褂?str.replace()
方法將字符串中的單引號替換為雙引號。
import json file_name = 'example.json' with open(file_name, 'r', encoding='utf-8', errors='ignore') as f: a_str = f.read() # { # "name": "Alice", # 'age': 30 ????? note single quotes # } print(a_str) # ? 用雙引號替換單引號 valid_json = a_str.replace("'", '"') result = json.loads(valid_json) print(result) # {'name': 'Alice', 'age': 30} print(result['name']) # Alice print(result['age']) # 30
str.replace
方法返回字符串的副本,其中所有出現(xiàn)的子字符串都被提供的替換項(xiàng)替換。
該方法采用以下參數(shù):
old 字符串中我們要替換的子串
new 替換每次出現(xiàn)的 old
count 僅替換第一個 count 出現(xiàn)(可選)
我們使用 replace()
方法將字符串中所有出現(xiàn)的單引號替換為雙引號。
這使得 JSON 有效,因此我們可以安全地使用 json.loads()
方法。
JSONEncoder 類默認(rèn)支持以下對象和類型的轉(zhuǎn)換。
Python | JSON |
---|---|
Python | JSON |
dict | object |
list, tuple | array |
str | string |
int、float、int 和 float 派生枚舉 | number |
True | true |
False | false |
None | null |
最常見的錯誤原因是:
嘗試解析無效的 JSON 值(例如單引號或尾隨逗號)。
從遠(yuǎn)程服務(wù)器(例如 204 或 404)獲取空響應(yīng)并嘗試將其作為 JSON 進(jìn)行解析。
嘗試像解析 JSON 一樣解析具有不同內(nèi)容類型(例如文本/html)的響應(yīng)。
嘗試錯誤地讀取 JSON 文件或嘗試解析空 JSON 文件的內(nèi)容。
感謝各位的閱讀,以上就是“Python錯誤JSONDecodeError: Expecting value: line 1 column 1怎么解決”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對Python錯誤JSONDecodeError: Expecting value: line 1 column 1怎么解決這一問題有了更深刻的體會,具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識點(diǎn)的文章,歡迎關(guān)注!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。