json.decoder.JSONDecodeError: 需要 ‘,’ 分隔符:第 1 行
json.decoder.JSONDecodeError: Expecting ‘,’ delimiter: line 1
当我们尝试解析无效的 JSON 字符串时,会出现 Python“json.decoder.JSONDecodeError: Expecting ‘,’ delimiter: line 1”。
要解决该错误,请确保使用两个反斜杠转义任何双引号并更正 JSON 字符串中的任何其他错误。
下面是错误如何发生的示例。
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)
请注意,数组中的所有对象都用逗号分隔,并且没有尾随逗号。
每个对象的键和值用冒号分隔,键值对用逗号分隔。
额外资源
您可以通过查看以下教程来了解有关相关主题的更多信息: