您好,登錄后才能下訂單哦!
這篇文章主要講解了“Python錯誤JSONDecodeError: Expecting value: line 1 column 1怎么解決”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Python錯誤JSONDecodeError: Expecting value: line 1 column 1怎么解決”吧!
Python“json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0) ”發生在我們試圖解析一些無效的 JSON 時。
要解決該錯誤,請確保響應或文件不為空,或者在解析之前有條件地檢查內容類型。
這是一個非常簡單的示例,說明錯誤是如何發生的。
import json # ?? json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0) result = json.loads('')
我們試圖將一個空字符串當作有效的 JSON 來解析。
最常見的錯誤原因是:
嘗試解析無效的 JSON 值(例如單引號或尾隨逗號)。
從遠程服務器(例如 204 或 404)獲取空響應并嘗試將其作為 JSON 進行解析。
嘗試像解析 JSON 一樣解析具有不同內容類型(例如文本/html)的響應。
嘗試錯誤地讀取 JSON 文件或嘗試解析空 JSON 文件的內容。
下面是一個存儲無效 JSON 的文件示例。
example.json
{ "id": 1, 'name': "Alice", "age": 30, "country": "Austria" }
請注意
,名稱屬性用單引號引起來。
這會使 JSON 無效,并且嘗試從文件中讀取會導致錯誤。
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" }
現在 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
確保在打開文件時設置編碼關鍵字參數(如上面的代碼示例所示)。
以下是無效和有效 JSON 值的一些示例。
example.json
// ?? 無效的 JSON(忘記引用屬性) { "name": "Alice", age: 30 }
對象中的 age 屬性未用雙引號引起來,這使得 JSON 無效。
example.json
// ? 有效的 JSON(所有屬性都用雙引號引起來) { "name": "Alice", "age": 30 }
示例中的 JSON 是有效的,因為所有屬性和字符串值都用雙引號引起來。
確保沒有屬性或字符串值用單引號引起來。
example.json
// ?? 無效的 JSON(用單引號引起來的名稱屬性) { 'name': "Alice", "age": 30 }
示例中的名稱屬性用單引號引起來,這使得 JSON 無效。
永遠不要在 JSON 中使用單引號。 屬性名稱和字符串值必須用雙引號引起來。
example.json
// ? 有效的 JSON(屬性名稱和值用雙引號引起來) { "name": "Alice", "age": 30 }
在數組的最后一個元素或最后一個鍵值對之后有尾隨逗號會使我們的 JSON 無效。
example.json
// ?? 無效的 JSON(最后一個屬性后的尾隨逗號) { "name": "Alice", "age": 30, ????? 這個逗號使它無效 JSON }
請注意
,在 age 屬性之后有一個尾隨逗號。
這會使 JSON 無效,因為不允許使用尾隨逗號。
要解決該錯誤,請確保刪除所有結尾的逗號。
example.json
// ? 有效的 JSON(沒有尾隨逗號) { "name": "Alice", "age": 30 }
如果我們在發出 API 請求時遇到錯誤,請確保響應在解析之前具有 application/json
內容類型標頭。
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
包并發出 HTTP DELETE
請求,該請求返回 204 狀態(無內容)。
嘗試像解析 JSON 一樣解析空響應會引發 JSONDecodeError
,因此我們必須檢查:
響應狀態不是 204(無內容)。
響應頭字典有一個內容類型鍵。
內容類型鍵的值為 application/json
。
這樣我們就可以確定服務器在嘗試使用 reponse.json()
方法(如果使用請求)或 json.loads(my_json_str)
解析它之前向我們發送了一個有效的 JSON 響應。
如果服務器向我們發送了一個空響應或響應不是 application/json
類型,我們將收到 JSONDecodeError
。
我們不能嘗試像解析 JSON 一樣解析 text/html
或 XML 響應(或空響應)。
該錯誤通常是在以下情況下引起的:
試圖錯誤地讀取 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}
確保我們正在讀取的文件不為空,因為這通常會導致錯誤。
如果我們的文件可能包含無效的 JSON,請使用 try/except
語句來處理錯誤。
假設我們有以下 JSON 文件。
example.json
{ "name": "Alice", 'age': 30 }
請注意,age 屬性是單引號的,這使得 JSON 無效。
下面是我們如何使用 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 數據,但文件包含無效的 JSON,因此引發異常,然后在 except 塊中處理。
錯誤的另一個常見原因是在嘗試從 JSON 文件讀取時將文件路徑傳遞給 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()
方法需要一個包含實現.read()
方法的 JSON 文檔的文本文件或二進制文件。
或者,我們可以手動調用文件對象的 read()
方法并使用 json.loads()
方法。
import json file_name = 'example.json' with open(file_name, 'r', encoding='utf-8') as f: # ????? 確保調用 read() my_data = json.loads(f.read()) print(my_data) # ????? {'name': 'Alice', 'age': 30} print(type(my_data)) # ????? <class 'dict'>
上面的示例實現了相同的結果,但是我們沒有依賴 json.load() 方法為我們調用文件對象上的 read() ,而是手動執行它并使用 json.loads() 方法。
json.loads()
方法基本上幫助我們從 JSON 字符串加載 Python 本機對象(例如字典或列表)。
如果我們需要在使用 json.loads()
方法之前使您的 JSON 有效,我們可以嘗試使用 str.replace()
方法。
下面是一個示例 JSON 文件,其中包含使 JSON 無效的單引號屬性。
example.json
{ "name": "Alice", 'age': 30 }
下面是我們如何使用 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
方法返回字符串的副本,其中所有出現的子字符串都被提供的替換項替換。
該方法采用以下參數:
old 字符串中我們要替換的子串
new 替換每次出現的 old
count 僅替換第一個 count 出現(可選)
我們使用 replace()
方法將字符串中所有出現的單引號替換為雙引號。
這使得 JSON 有效,因此我們可以安全地使用 json.loads()
方法。
JSONEncoder 類默認支持以下對象和類型的轉換。
Python | JSON |
---|---|
Python | JSON |
dict | object |
list, tuple | array |
str | string |
int、float、int 和 float 派生枚舉 | number |
True | true |
False | false |
None | null |
最常見的錯誤原因是:
嘗試解析無效的 JSON 值(例如單引號或尾隨逗號)。
從遠程服務器(例如 204 或 404)獲取空響應并嘗試將其作為 JSON 進行解析。
嘗試像解析 JSON 一樣解析具有不同內容類型(例如文本/html)的響應。
嘗試錯誤地讀取 JSON 文件或嘗試解析空 JSON 文件的內容。
感謝各位的閱讀,以上就是“Python錯誤JSONDecodeError: Expecting value: line 1 column 1怎么解決”的內容了,經過本文的學習后,相信大家對Python錯誤JSONDecodeError: Expecting value: line 1 column 1怎么解決這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。