JSONDecodeError:预期值:第 1 行第 1 列(字符 0)

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 的文件示例。

例子.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 中的所有键和字符串值用双引号引起来

例子.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 值的一些示例。

例子.json
// ⛔️ invalid JSON (forgot to quote a property) { "name": "Alice", age: 30 }

age对象中的属性未用双引号引起来,这使得 JSON 无效

例子.json
// ✅ valid JSON (all properties are double-quoted) { "name": "Alice", "age": 30 }

示例中的 JSON 是有效的,因为所有属性和字符串值都用双引号引起来。

对属性或值使用单引号而不是双引号

确保没有属性或字符串值用单引号引起来。

例子.json
// ⛔️ invalid JSON (name property wrapped in single quotes) { 'name': "Alice", "age": 30 }

name示例中的属性用单引号引起来,这使得 JSON 无效

永远不要在 JSON 中使用单引号。属性名称和字符串值必须用双引号引起来。

例子.json
// ✅ valid JSON (property names and values are double-quoted) { "name": "Alice", "age": 30 }

确保你没有尾随逗号

在数组的最后一个元素或最后一个键值对之后有尾随逗号会使您的 JSON 无效。

例子.json
// ⛔️ invalid JSON (trailing comma after last property) { "name": "Alice", "age": 30, 👈️ this comma makes it invalid JSON }

请注意,属性后有一个尾随逗号age

这会使 JSON 无效,因为不允许使用尾随逗号。

要解决该错误,请确保删除所有结尾的逗号。

例子.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 状态(无内容)的requestsHTTP请求。DELETE

尝试将空响应当作 JSON 来解析会引发 a JSONDecodeError,因此我们必须检查:

  1. 响应状态不是204(无内容)。
  2. 响应头字典有一个content-type键。
  3. 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 文件

该错误通常是在以下情况下引起的:

  1. 试图错误地读取 JSON 文件。
  2. 尝试读取一个空的 JSON 文件。
  3. 尝试读取包含无效 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在同一目录中有一个名为 的文件。

例子.json
{"name": "Alice", "age": 30}

确保您正在读取的文件不为空,因为这通常会导致错误。

使用try/except语句来处理潜在的错误

如果您的文件可能包含无效的 JSON,请使用try/except语句来处理错误。

假设我们有以下 JSON 文件。

例子.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 无效的单引号属性。

例子.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 文件的内容。

额外资源

您可以通过查看以下教程来了解有关相关主题的更多信息: