json.decoder.JSONDecodeError: 需要 ‘,’ 分隔符:第 1 行

json.decoder.JSONDecodeError: 需要 ‘,’ 分隔符:第 1 行

json.decoder.JSONDecodeError: Expecting ‘,’ delimiter: line 1

当我们尝试解析无效的 JSON 字符串时,会出现 Python“json.decoder.JSONDecodeError: Expecting ‘,’ delimiter: line 1”。

要解决该错误,请确保使用两个反斜杠转义任何双引号并更正 JSON 字符串中的任何其他错误。

类型错误加载缺少 1 个必需的位置参数加载器

下面是错误如何发生的示例。

主程序
import json # ⛔️ json.decoder.JSONDecodeError: Expecting ',' delimiter: line 1 column 31 (char 30) data = json.loads( '{ "employee":{ "name":"Alice \"developer\"" } }' ) # 👆️ did not escape JSON str correctly

不正确地转义引号

请注意,键的值name包含双引号。

每个双引号都应该用两个反斜杠转义。

用两个反斜杠转义字符串中的双引号

如果字符串中有双引号,请确保使用两个反斜杠将其转义。

主程序
import json data = json.loads( '{ "employee":{ "name":"Alice \\"developer\\"" } }' ) print(data) # 👉️ {'employee': {'name': 'Alice "developer"'}}

您只需要用两个反斜杠转义字符串内容中的双引号,而不是封闭的双引号。

主程序
import json # ✅ don't have to escape enclosing double quotes data = json.loads( '{ "employee":{ "name":"Alice developer" } }' ) # ✅ esacpe double quotes in the contents of the string data = json.loads( '{ "employee":{ "name":"Alice \\"developer\\"" } }' ) print(data) # 👉️ {'employee': {'name': 'Alice "developer"'}}

改为声明原始字符串

或者,您可以在字符串前加上前缀r以指示它是原始字符串。

主程序
import json data = json.loads( r'{ "employee":{ "name":"Alice \"developer\"" } }' ) print(data) # 👉️ {'employee': {'name': 'Alice "developer"'}}
带有前缀的字符串r称为原始字符串,并将反斜杠视为文字字符。

因此,您不必使用 2 个反斜杠转义双引号,可以使用单个反斜杠字符。

主程序
import json # ✅ declaring a raw string data = json.loads( r'{ "employee":{ "name":"Alice \"developer\"" } }' ) print(data) # 👉️ {'employee': {'name': 'Alice "developer"'}} # ------------------------------------------------------------ # ✅ declaring a regular string data = json.loads( '{ "employee":{ "name":"Alice \\"developer\\"" } }' ) print(data) # 👉️ {'employee': {'name': 'Alice "developer"'}}

第一个示例使用原始字符串,因此我们不必使用两个反斜杠来转义字符串内容中的双引号。

手动写入 JSON

如果您在手动编写 JSON 时出错,声明一个 Python 字典或列表并使用该JSON.dumps方法将值转换为 JSON 字符串会容易得多。

主程序
import json my_json = json.dumps( { "employee": {"name": 'Alice "developer"'} } ) my_dict = json.loads(my_json) print(my_dict) # 👉️ {'employee': {'name': 'Alice "developer"'}} print(my_dict['employee']) # 👉️ {'name': 'Alice "developer"'}

我们声明了一个 Python 字典并将其传递给JSON.dumps()将其转换为字符串的方法。

请注意,我们可以在声明 Python 字典时使用单引号键或值。

key的值name包含双引号,所以我们用单引号把它包起来。

json.dumps方法将 Python 对象转换为 JSON 格式字符串。

如果我们在 JSON 字符串中有任何语法错误,也会导致该错误。

在 JSON 数组中使用冒号会导致错误

以下是由于在 JSON 数组中使用冒号而导致语法错误的示例。

主程序
import json # ⛔️ json.decoder.JSONDecodeError: Expecting ',' delimiter: line 1 column 8 (char 7) data = json.loads( '["name": "Alice", "age": 30]' )

如果你打算声明一个 JSON 数组,请确保用逗号分隔它的元素。

主程序
# ✅ Separate array elements by a comma import json data = json.loads( '["name", "Alice", "age", 30]' ) print(data) # 👉️ ['name', 'Alice', 'age', 30]

确保数组的所有元素都用逗号分隔,并且没有尾随逗号。

主程序
import json # ✅ correct all elements separated by comma data = json.loads( '["name", "Alice", "age", 30]' ) print(data) # 👉️ ['name', 'Alice', 'age', 30] # ------------------------------------------------ # ⛔️ error has trailing comma after last element data = json.loads( '["name", "Alice", "age", 30,]' )

第一个示例用逗号分隔 JSON 数组中的所有元素,因此一切都按预期进行。

第二个示例在导致错误的最后一个数组元素之后有一个尾随逗号。

声明一个存储键值对的 JSON 对象

如果您打算声明一组键值对,请将它们括在花括号中。

主程序
# ✅ declaring an object import json data = json.loads( '{"name": "Alice", "age": 30}' ) print(data) # 👉️ {'name': 'Alice', 'age': 30}

验证和更正 JSON 的最快方法是使用
JSON 验证器

将您的有效负载粘贴到表单中。验证器检查错误,有时直接修复错误。

从你的服务器获取无效的 JSON 数据

如果您发出 HTTP 请求并获得无效的 JSON 数据,则必须在后端修复该问题。

下面是一个更复杂的 JSON 字符串的示例。

主程序
import json data = json.loads( """ [ {"id": 1, "name": "Alice", "is_subscribed": true}, {"id": 2, "name": "Bob", "is_subscribed": false}, {"id": 3, "name": "Carl", "is_subscribed": true, "address": {"country": "Canada"}} ] """ ) # 👇️ [{'id': 1, 'name': 'Alice', 'is_subscribed': True}, {'id': 2, 'name': 'Bob', 'is_subscribed': False}, {'id': 3, 'name': 'Carl', 'is_subscribed': True, 'address': {'country': 'Canada'}}] print(data)

请注意,数组中的所有对象都用逗号分隔,并且没有尾随逗号。

每个对象的键和值用冒号分隔,键值对用逗号分隔。

额外资源

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