JSONDecodeError:预期值:第 1 行第 1 列(字符 0)
JSONDecodeError: Expecting value: line 1 column 1 (char 0)
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 时处理异常,请使用
try/except语句。
import json my_str = '' try: result = json.loads(my_str) except json.decoder.JSONDecodeError: # 👇️ this runs print('The string does NOT contain valid JSON')
如果出现错误,该except
块将运行。
从文件读取时也可以这样做。
import json file_name = 'example.json' with open(file_name, 'r', encoding='utf-8') as f: try: my_data = json.load(f) # 👈️ parse the JSON with load() print(my_data) except BaseException as e: print('The file contains invalid JSON')
常见错误原因
最常见的错误原因是:
- 尝试解析无效的 JSON 值(例如单引号或尾随逗号)。
- 从远程服务器(例如 204 或 404)获取空响应并尝试将其作为 JSON 进行解析。
- 尝试解析具有不同内容类型(例如 )的响应,
text/html
就好像它是 JSON 一样。 - 尝试错误地读取 JSON 文件或尝试解析空 JSON 文件的内容。
尝试解析无效的 JSON 值
下面是一个存储无效 JSON 的文件示例。
{ "id": 1, 'name': "Alice", "age": 30, "country": "Austria" }
请注意,该name
属性用单引号引起来。
这会使 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 中的所有键和字符串值用双引号引起来。
{ "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
encoding
在打开文件时设置关键字参数(如上面的代码示例所示)。忘记用引号括起属性或字符串值
以下是无效和有效 JSON 值的一些示例。
// ⛔️ invalid JSON (forgot to quote a property) { "name": "Alice", age: 30 }
age
对象中的属性未用双引号引起来,这使得 JSON 无效。
// ✅ valid JSON (all properties are double-quoted) { "name": "Alice", "age": 30 }
示例中的 JSON 是有效的,因为所有属性和字符串值都用双引号引起来。
对属性或值使用单引号而不是双引号
确保没有属性或字符串值用单引号引起来。
// ⛔️ invalid JSON (name property wrapped in single quotes) { 'name': "Alice", "age": 30 }
name
示例中的属性用单引号引起来,这使得 JSON 无效。
永远不要在 JSON 中使用单引号。属性名称和字符串值必须用双引号引起来。
// ✅ valid JSON (property names and values are double-quoted) { "name": "Alice", "age": 30 }
确保你没有尾随逗号
在数组的最后一个元素或最后一个键值对之后有尾随逗号会使您的 JSON 无效。
// ⛔️ invalid JSON (trailing comma after last property) { "name": "Alice", "age": 30, 👈️ this comma makes it invalid JSON }
请注意,属性后有一个尾随逗号age
。
这会使 JSON 无效,因为不允许使用尾随逗号。
要解决该错误,请确保删除所有结尾的逗号。
// ✅ valid JSON (no trailing commas) { "name": "Alice", "age": 30 }
发出 HTTP 请求时得到空响应
如果您在发出 API 请求时遇到错误,请确保响应application/json
在解析之前具有内容类型标头。
import requests def make_request(): response = requests.delete('https://reqres.in/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()
该示例使用包并发出返回 204 状态(无内容)的requests
HTTP请求。DELETE
尝试将空响应当作 JSON 来解析会引发 a JSONDecodeError
,因此我们必须检查:
- 响应状态不是
204
(无内容)。 - 响应头字典有一个
content-type
键。 content-type
密钥的值为application/json
。
这样我们就可以确定服务器在尝试使用方法reponse.json()
(如果使用requests
)或使用解析它之前向我们发送了有效的 JSON 响应json.loads(my_json_str)
。
确保 API 不会以不正确的 Content-Type 响应
如果服务器向您发送了一个空响应或响应不是类型,
application/json
您将得到一个JSONDecodeError
.
您不能尝试像解析 JSON 一样解析 atext/html
或响应(或空响应)。XML
试图读取一个空的 JSON 文件或错误地读取一个 JSON 文件
该错误通常是在以下情况下引起的:
- 试图错误地读取 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) # 👈️ parse the JSON with load() print(my_data) # 👉️ {'name': 'Alice', 'age': 30}
该示例假定example.json
在同一目录中有一个名为 的文件。
{"name": "Alice", "age": 30}
确保您正在读取的文件不为空,因为这通常会导致错误。
使用try/except
语句来处理潜在的错误
如果您的文件可能包含无效的 JSON,请使用try/except
语句来处理错误。
假设我们有以下 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) # 👈️ parse the JSON with load() print(my_data) except BaseException as e: print('The file contains invalid JSON')
我们尝试从文件中解析 JSON 数据,但文件包含无效的 JSON,因此引发异常,然后在 except 块中处理。
确保不要将文件路径传递给json.loads()
错误的另一个常见原因是json.loads()
在尝试从 JSON 文件读取时将文件路径传递给方法。
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) # ✅ passing the file object to json.load() print(my_data) # 👉️ {'name': 'Alice', 'age': 30}
json.load()
方法需要一个包含实现方法的 JSON 文档的文本文件或二进制文件.read()
。 手动调用read()
方法json.loads()
或者,您手动调用read()
文件对象上的方法并使用该json.loads()
方法。
import json file_name = 'example.json' with open(file_name, 'r', encoding='utf-8') as f: # 👇️ make sure to call 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 有效json.loads()
str.replace()
如果您需要在使用该方法之前使您的 JSON 有效,您可以尝试使用该json.loads()
方法。
下面是一个示例 JSON 文件,其中包含使 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) # ✅ replace single quotes with double quotes 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 |
数数 | count 只替换第一次出现的(可选) |
我们使用该replace()
方法将字符串中所有出现的单引号替换为双引号。
这使得 JSON 有效,因此我们可以安全地使用该json.loads()
方法。
该类JSONEncoder
默认支持以下对象和类型的转换。
Python | JSON |
---|---|
字典 | 目的 |
列表,元组 | 大批 |
海峡 | 细绳 |
int、float、int 和 float 派生枚举 | 数字 |
真的 | 真的 |
错误的 | 错误的 |
没有任何 | 无效的 |
通常导致错误的事情
“json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)”错误的最常见原因是:
- 尝试解析无效的 JSON 值(例如单引号或尾随逗号)。
- 从远程服务器(例如 204 或 404)获取空响应并尝试将其作为 JSON 进行解析。
- 尝试解析具有不同内容类型(例如 )的响应,
text/html
就好像它是 JSON 一样。 - 尝试错误地读取 JSON 文件或尝试解析空 JSON 文件的内容。
额外资源
您可以通过查看以下教程来了解有关相关主题的更多信息: