Python 中 JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2
当我们尝试解析无效的 JSON 字符串(例如,单引号键或值,或尾随逗号)时,会出现 Python“JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1) ”。
使用 ast.literal_eval()
方法解决错误。
下面是错误如何发生的示例。
import json
invalid_json = r"{'name': 'Alice'}" # 👈️ single-quoted
# ⛔️ json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)
result = json.loads(invalid_json)
请注意
,该字符串具有单引号键和值,这意味着它不是有效的 JSON 字符串。
JSON(字符串)键和值必须用双引号引起来。
import json
# ✅ 有效的 JSON 字符串
valid_json = r'{"name": "Jiyik", "age": 30}' # 👈️ no trailing comma
a_dict = json.loads(valid_json)
print(a_dict) # {'name': 'Jiyik', 'age': 30}
上面的示例字符串是有效的 JSON,因为属性和值被双引号括起来并且没有尾随逗号。
相反,它只是一个包裹在字符串中的 Python 字典。
使用 ast.literal_eval 方法评估字符串
我们可以通过使用 ast.literal_eval
方法评估包含 Python 文字的字符串来解决错误。
import ast
invalid_json = r"{'name': 'Jiyik'}"
result = ast.literal_eval(invalid_json)
print(type(result)) # 👉️ <class 'dict'>
print(result) # 👉️ {'name': 'Jiyik'}
print(result['name']) # 👉️ Jiyik
ast.literal_eval
方法允许我们安全地评估包含 Python 文字的字符串。
字符串可能由字符串、字节、数字、元组、列表、字典、集合、布尔值和 None 组成。
将 Python 字典转换为 JSON
如果我们尝试将 Python 字典转换为 JSON 字符串,请使用 json.dumps()
方法。
import json
my_dict = {
'id': 1,
'name': 'Jiyik',
'age': 30,
}
json_str = json.dumps(my_dict)
print(json_str) # {"id": 1, "name": "Jiyik", "age": 30}
print(type(json_str)) # <class 'str'>
请注意
,我们没有将my_dict
变量用单引号或双引号括起来来声明字典。
如果将变量用引号引起来,则最终会声明一个字符串。
json.dumps
方法将 Python 对象转换为 JSON 格式的字符串。
使用 str.replace 方法将单引号替换为双引号
另一种方法是使用 str.replace()
方法将字符串中的所有单引号替换为双引号。
import json
invalid_json = r"{'name': 'Alice'}"
valid_json = invalid_json.replace("\'", "\"")
print(valid_json) # 👉️ '{"name": "Alice"}'
my_dict = json.loads(valid_json)
print(my_dict) # 👉️ {'name': 'Alice'}
print(type(my_dict)) # 👉️ <class 'dict'>
str.replace 方法返回字符串的副本,其中所有出现的子字符串都被提供的替换项替换。
该方法采用以下参数:
- old 字符串中我们要替换的子串
- new 替换每次出现的 old
- count 仅替换第一个 count 出现(可选)
a_str = "'one', 'two', 'three'"
result = a_str.replace("'", '"')
print(result) # "one", "two", "three"
然而,这是非常危险的,因为字符串可能在其内容的某处包含单引号,例如 是她。
使用 ast.literal_eval 处理尾随逗号
如果我们的字符串包含尾随逗号,我们也可以使用 ast.literal_eval
方法。
import ast
invalid_json = r'{"name": "Jiyik",}' # 👈️ 有尾随逗号
result = ast.literal_eval(invalid_json)
print(type(result)) # 👉️ <class 'dict'>
print(result) # 👉️ {'name': 'Jiyik'}
print(result['name']) # 👉️ Jiyik
尾随逗号也会使字符串无效 JSON,但 Python 字典允许在最后一个键值对之后有一个尾随逗号。
使用 PyYAML 模块解析字符串
或者,我们可以尝试使用 yaml.safe_load()
方法。
通过运行 pip install pyyaml
确保安装了 pyyaml。
$ pip install pyyaml
$ pip3 install pyyaml
现在我们可以导入并使用该模块来解析 JSON 字符串。
import yaml
invalid_json = r'{"name": "Alice",}' # 👈️ has trailing comma
my_dict = yaml.safe_load(invalid_json)
print(my_dict) # 👉️ {'name': 'Alice'}
print(type(my_dict)) # 👉️ <class 'dict'>
确保我们尝试解析的值是一个 JSON 字符串,并且尚未解析为本机 Python 对象。
使用 str.replace() 方法删除结尾的逗号
我们还可以使用 str.replace()
方法从字符串中删除结尾的逗号。
import json
invalid_json = r'{"name": "Jiyik",}' # 👈️ 有尾随逗号
valid_json = invalid_json.replace(
',}', '}').replace(',]', ']').replace(',)', ')')
print(valid_json) # {"name": "Jiyik"}
a_dict = json.loads(valid_json)
print(a_dict) # {'name': 'Jiyik'}
我们将 3 个调用链接到 str.replace()
方法。
第一次调用删除大括号前的尾随逗号。
第二次调用删除方括号前的尾随逗号。
第三个调用删除了括号前的尾随逗号。
有效 JSON 与无效 JSON
以下是有效和无效 JSON 字符串的一些示例。
# ⛔️ invalid JSON (has single-quoted keys and values)
invalid_json = r"{'name': 'Alice', 'age': 30, 'tasks' ['a', 'b', 'c']}"
# ✅ valid JSON (double-quoted keys and values)
valid_json = r'{"name": "Alice", "age": 30, "tasks": ["a", "b", "c"]}'
确保最后一个元素后没有尾随逗号。
# ⛔️ 无效的 JSON(在最后一个键值对之后有一个尾随逗号)
invalid_json = r'{"name": "Alice", "age": 30,}'
# ✅ 有效的 JSON(最后一个键值对后没有尾随逗号)
valid_json = r'{"name": "Alice", "age": 30}'
将 Python 对象转换为 JSON 字符串,反之亦然
如果需要将 JSON 字符串解析为原生 Python 对象,则必须使用 json.loads()
方法,如果需要将 Python 对象转换为 JSON 字符串,则必须使用 json.dumps()
方法。
import json
json_str = r'{"name": "Alice", "age": 30}'
# ✅ 将 JSON 字符串解析为 Python 原生字典
my_dict = json.loads(json_str)
print(type(my_dict)) # 👉️ <class 'dict'>
# ✅ 将 Python 原生字典转换为 JSON 字符串
my_json_str = json.dumps(my_dict)
print(type(my_json_str)) # 👉️ <class 'str'>
json.loads()
方法基本上帮助我们从 JSON 字符串加载 Python 本机对象(例如字典或列表)。
json.dumps
方法将 Python 对象转换为 JSON 格式的字符串。
JSONEncoder 类默认支持以下对象和类型。
Python | JSON |
---|---|
dict | object |
list, tuple | array |
str | string |
int、float、int 和 float 派生枚举 | number |
True | true |
False | false |
None | null |
验证你的 JSON 字符串#
我们可以将代码粘贴到在线语法验证器中。 验证器应该能够告诉我们错误发生在哪一行。
我们可以将鼠标悬停在波浪形的红线上,以获取有关引发错误原因的更多信息。
检查变量存储的类型
如果我们不确定变量存储的对象类型,请使用内置的 type()
类。
my_dict = {'name': 'Alice', 'age': 30}
print(type(my_dict)) # 👉️ <class 'dict'>
print(isinstance(my_dict, dict)) # 👉️ True
my_str = 'hello world'
print(type(my_str)) # 👉️ <class 'str'>
print(isinstance(my_str, str)) # 👉️ True
类型类返回对象的类型。
如果传入的对象是传入类的实例或子类,则 isinstance
函数返回 True。
总结
当我们尝试解析无效的 JSON 字符串(例如,单引号键或值,或尾随逗号)时,会出现 Python“JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1) ”。
使用 ast.literal_eval()
方法解决错误。
相关文章
Python for 循环中的下一项
发布时间:2023/04/26 浏览次数:179 分类:Python
-
本文讨论了 Python 中的 for 循环以及如何通过使用 for 循环和示例来跳过列表的第一个元素。
Python While 循环用户输入
发布时间:2023/04/26 浏览次数:148 分类:Python
-
我们可以在 while 循环中使用 input() 函数来输入数据,直到在 Python 中满足某个条件。
在 Python 中将整数转换为罗马数字
发布时间:2023/04/26 浏览次数:87 分类:Python
-
本篇文章将介绍在 Python 中将整数转换为罗马数字。以下是一个 Python 程序的实现,它将给定的整数转换为其等效的罗马数字。
在 Python 中将罗马数字转换为整数
发布时间:2023/04/26 浏览次数:144 分类:Python
-
本文讨论如何在 Python 中将罗马数字转换为整数。 我们将使用 Python if 语句来执行此操作。 我们还将探讨在 Python 中将罗马数字更改为整数的更多方法。
在 Python 中读取 gzip 文件
发布时间:2023/04/26 浏览次数:70 分类:Python
-
本篇文章强调了压缩文件的重要性,并演示了如何在 Python 中使用 gzip 进行压缩和解压缩。
在 Python 中锁定文件
发布时间:2023/04/26 浏览次数:141 分类:Python
-
本文解释了为什么在 Python 中锁定文件很重要。 这讨论了当两个进程在没有锁的情况下与共享资源交互时会发生什么的示例,为什么在放置锁之前知道文件状态很重要,等等
在 Python 中将 PDF 转换为文本
发布时间:2023/04/26 浏览次数:196 分类:Python
-
在本教程中,我们将学习如何使用 Python 使用 PyPDF2、Aspose 和 PDFminer 将 PDF 文档转换为文本文件。
在 Python 中创建临时文件
发布时间:2023/04/26 浏览次数:53 分类:Python
-
本文讲解了tempfile库函数的四个子函数:TemporaryFile、NamedTemporaryFile、mkstemp、TemporaryDirectory。 每个部分都提供了适当的程序,以简化对概念的理解。