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)) # 👉️
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)) #
请注意
,我们没有将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)) # 👉️
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)) # 👉️
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)) # 👉️
确保我们尝试解析的值是一个 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)) # 👉️
# ✅ 将 python 原生字典转换为 json 字符串
my_json_str = json.dumps(my_dict)
print(type(my_json_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)) # 👉️
print(isinstance(my_dict, dict)) # 👉️ true
my_str = 'hello world'
print(type(my_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()
方法解决错误。
转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处
本文地址:
相关文章
python pandas.pivot_table() 函数
发布时间:2024/04/24 浏览次数:82 分类:python
-
python pandas pivot_table()函数通过对数据进行汇总,避免了数据的重复。
在 python 中将 pandas 系列的日期时间转换为字符串
发布时间:2024/04/24 浏览次数:894 分类:python
-
了解如何在 python 中将 pandas 系列日期时间转换为字符串
在 python pandas 中使用 str.split 将字符串拆分为两个列表列
发布时间:2024/04/24 浏览次数:1124 分类:python
-
本教程介绍如何使用 pandas str.split() 函数将字符串拆分为两个列表列。
在 pandas 中将 timedelta 转换为 int
发布时间:2024/04/23 浏览次数:231 分类:python
-
可以使用 pandas 中的 dt 属性将 timedelta 转换为整数。
python 中的 pandas 插入方法
发布时间:2024/04/23 浏览次数:112 分类:python
-
本教程介绍了如何在 pandas dataframe 中使用 insert 方法在 dataframe 中插入一列。
使用 python 将 pandas dataframe 保存为 html
发布时间:2024/04/21 浏览次数:106 分类:python
-
本教程演示如何将 pandas dataframe 转换为 python 中的 html 表格。
如何将 python 字典转换为 pandas dataframe
发布时间:2024/04/20 浏览次数:73 分类:python
-
本教程演示如何将 python 字典转换为 pandas dataframe,例如使用 pandas dataframe 构造函数或 from_dict 方法。
如何在 pandas 中将 dataframe 列转换为日期时间
发布时间:2024/04/20 浏览次数:101 分类:python
-
本文介绍如何将 pandas dataframe 列转换为 python 日期时间。