JSONDecodeError:需要用双引号括起来的属性名称:第 1 行第 2 列(字符 1)

JSONDecodeError:需要用双引号括起来的属性名称:第 1 行第 2 列(字符 1)

JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)

当我们尝试解析无效的 JSON 字符串(例如单引号键或值,或尾随逗号)时,会出现 Python“JSONDecodeError:期望用双引号括起来的属性名称:第 1 行第 2 列(字符 1)”。

使用该ast.literal_eval()方法解决错误。

以下是错误发生方式的示例。

main.py
import json invalid_json = r"{'name': 'Bobby'}" # 👈️ single-quoted # ⛔️ json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1) result = json.loads(invalid_json)

单引号属性

请注意,该字符串具有单引号键和值,这意味着它不是有效的 JSON 字符串。

相反,它只是一个包裹在字符串中的 Python 字典。

JSON(字符串)键和值必须用双引号引起来。
main.py
import json # ✅ valid JSON string valid_json = r'{"name": "Bobby Hadz", "age": 30}' # 👈️ no trailing comma a_dict = json.loads(valid_json) print(a_dict) # {'name': 'Bobby Hadz', 'age': 30}

上面的示例字符串是有效的 JSON,因为属性和值都用双引号引起来并且没有尾随逗号。

使用ast.literal_eval方法来计算字符串

ast.literal_eval您可以通过使用计算包含 Python 文字的字符串的方法来解决该错误。

main.py
import ast invalid_json = r"{'name': 'Bobby Hadz'}" result = ast.literal_eval(invalid_json) print(type(result)) # 👉️ <class 'dict'> print(result) # 👉️ {'name': 'Bobby Hadz'} print(result['name']) # 👉️ Bobby Hadz

ast.literal_eval
方法允许我们安全地计算包含 Python 文字

字符串。

该字符串可以由字符串、字节、数字、元组、列表、字典、集合、布尔值和 None 组成。

将 Python 字典转换为 JSON

如果您尝试将 Python 字典转换为 JSON 字符串,请使用该
json.dumps()方法。

main.py
import json my_dict = { 'id': 1, 'name': 'Bobby Hadz', 'age': 30, } json_str = json.dumps(my_dict) print(json_str) # {"id": 1, "name": "Bobby Hadz", "age": 30} print(type(json_str)) # <class 'str'>

请注意,我们没有将my_dict变量括在单引号或双引号中来声明字典。

如果将变量用引号引起来,则最终会声明一个字符串。

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

使用str.replace双引号替换单引号的方法

另一种方法是使用str.replace()方法将字符串中的所有单引号替换为双引号。

main.py
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
数数 count替换第一次出现的内容(可选)
main.py
a_str = "'one', 'two', 'three'" result = a_str.replace("'", '"') print(result) # "one", "two", "three"
然而,这是非常危险的,因为字符串可能在其内容中的某处包含单引号,例如It's her

用于ast.literal_eval处理尾随逗号

ast.literal_eval如果您的字符串包含尾随逗号,您也可以使用该方法。

main.py
import ast invalid_json = r'{"name": "Bobby Hadz",}' # 👈️ has trailing comma result = ast.literal_eval(invalid_json) print(type(result)) # 👉️ <class 'dict'> print(result) # 👉️ {'name': 'Bobby Hadz'} print(result['name']) # 👉️ Bobby Hadz

尾随逗号也会使字符串无效 JSON,但 Python 字典允许在最后一个键值对之后有尾随逗号。

使用 PyYAML 模块解析字符串

或者,您可以尝试使用该yaml.safe_load()方法。

确保您已pyyaml通过运行
pip install pyyaml进行安装。

pip install pyyaml pip3 install pyyaml

现在您可以导入并使用该模块来解析 JSON 字符串。

main.py
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()方法从字符串中删除尾随逗号。

main.py
import json invalid_json = r'{"name": "Bobby Hadz",}' # 👈️ has trailing comma valid_json = invalid_json.replace( ',}', '}').replace(',]', ']').replace(',)', ')') print(valid_json) # {"name": "Bobby Hadz"} a_dict = json.loads(valid_json) print(a_dict) # {'name': 'Bobby Hadz'}

我们链接了对该方法的 3 次调用str.replace()

第一个调用删除大括号之前的尾随逗号。

第二个调用删除方括号之前的尾随逗号。

第三次调用删除括号前面的尾随逗号。

有效 JSON 与无效 JSON

以下是有效和无效 JSON 字符串的一些示例。

main.py
# ⛔️ 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"]}'

确保最后一个元素后面没有逗号。

main.py
# ⛔️ invalid JSON (has a trailing comma after the last key-value pair) invalid_json = r'{"name": "Alice", "age": 30,}' # ✅ valid JSON (has no trailing comma after the last key-value pair) valid_json = r'{"name": "Alice", "age": 30}'

将 Python 对象转换为 JSON 字符串,反之亦然

如果需要将 JSON 字符串解析为原生 Python 对象,则必须使用该json.loads()方法,如果需要将 Python 对象转换为 JSON 字符串,则必须使用该json.dumps()方法。

main.py
import json json_str = r'{"name": "Alice", "age": 30}' # ✅ parse JSON string to Python native dict my_dict = json.loads(json_str) print(type(my_dict)) # 👉️ <class 'dict'> # ✅ convert Python native dict to a JSON string 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
词典 目的
列表、元组 大批
斯特 细绳
int、float、int 和 float 派生枚举 数字
真的 真的
错误的 错误的
没有任何 无效的

验证您的 JSON 字符串

您可以将代码粘贴到在线语法验证器中。验证器应该能够告诉您错误发生在哪一行。

您可以将鼠标悬停在波浪状的红线上以获取有关引发错误的原因的更多信息。

检查变量存储的类型

如果您不确定变量存储什么类型的对象,请使用内置类
type()

main.py
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

额外资源

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