python 中 jsondecodeerror: expecting property name enclosed in double quotes: line 1 column 2-ag捕鱼王app官网

python 中 jsondecodeerror: expecting property name enclosed in double quotes: line 1 column 2

作者:迹忆客 最近更新:2023/04/22 浏览次数:

当我们尝试解析无效的 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)

python 中 jsondecodeerror

请注意 ,该字符串具有单引号键和值,这意味着它不是有效的 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 插入方法

发布时间:2024/04/23 浏览次数:112 分类:python

本教程介绍了如何在 pandas dataframe 中使用 insert 方法在 dataframe 中插入一列。

pandas 重命名多个列

发布时间:2024/04/22 浏览次数:199 分类:python

本教程演示了如何使用 pandas 重命名数据框中的多个列。

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便
网站地图