解决Python 中JSONDecodeError: Expecting value: line 1 column 1 (char 0)错误
作者:迹忆客 发布时间:2023-10-30 22:42:03
Python“json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0) ”发生在我们试图解析一些无效的 JSON 时。
要解决该错误,请确保响应或文件不为空,或者在解析之前有条件地检查内容类型。
尝试解析空字符串会导致错误
这是一个非常简单的示例,说明错误是如何发生的。
import json
# ⛔️ json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
result = json.loads('')
我们试图将一个空字符串当作有效的 JSON 来解析。
错误的常见原因
最常见的错误原因是:
尝试解析无效的 JSON 值(例如单引号或尾随逗号)。
从远程服务器(例如 204 或 404)获取空响应并尝试将其作为 JSON 进行解析。
尝试像解析 JSON 一样解析具有不同内容类型(例如文本/html)的响应。
尝试错误地读取 JSON 文件或尝试解析空 JSON 文件的内容。
尝试解析无效的 JSON 值
下面是一个存储无效 JSON 的文件示例。
example.json
{
"id": 1,
'name': "Alice",
"age": 30,
"country": "Austria"
}
请注意
,名称属性用单引号引起来。
这会使 JSON 无效,并且尝试从文件中读取会导致错误。
import json
file_name = 'example.json'
# ⛔️ json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 3 column 3 (char 15)
with open(file_name, 'r', encoding='utf-8') as f:
my_data = json.load(f)
print(my_data)
要解决该错误,需要确保将 JSON 中的所有键和字符串值用双引号引起来。
example.json
{
"id": 1,
"name": "Alice",
"age": 30,
"country": "Austria"
}
现在 name 键用双引号括起来,我们可以安全地从文件中读取。
# ✅ works as expected
import json
file_name = 'example.json'
with open(file_name, 'r', encoding='utf-8') as f:
my_data = json.load(f)
# 👇️ {'id': 1, 'name': 'Alice', 'age': 30, 'country': 'Austria'}
print(my_data)
print(my_data['name']) # 👉️ Alice
确保在打开文件时设置编码关键字参数(如上面的代码示例所示)。
忘记用引号括起属性或字符串值
以下是无效和有效 JSON 值的一些示例。
example.json
// ⛔️ 无效的 JSON(忘记引用属性)
{
"name": "Alice",
age: 30
}
对象中的 age 属性未用双引号引起来,这使得 JSON 无效。
example.json
// ✅ 有效的 JSON(所有属性都用双引号引起来)
{
"name": "Alice",
"age": 30
}
示例中的 JSON 是有效的,因为所有属性和字符串值都用双引号引起来。
对属性或值使用单引号而不是双引号
确保没有属性或字符串值用单引号引起来。
example.json
// ⛔️ 无效的 JSON(用单引号引起来的名称属性)
{
'name': "Alice",
"age": 30
}
示例中的名称属性用单引号引起来,这使得 JSON 无效。
永远不要在 JSON 中使用单引号。 属性名称和字符串值必须用双引号引起来。
example.json
// ✅ 有效的 JSON(属性名称和值用双引号引起来)
{
"name": "Alice",
"age": 30
}
确保你没有尾随逗号
在数组的最后一个元素或最后一个键值对之后有尾随逗号会使我们的 JSON 无效。
example.json
// ⛔️ 无效的 JSON(最后一个属性后的尾随逗号)
{
"name": "Alice",
"age": 30, 👈️ 这个逗号使它无效 JSON
}
请注意
,在 age 属性之后有一个尾随逗号。
这会使 JSON 无效,因为不允许使用尾随逗号。
要解决该错误,请确保删除所有结尾的逗号。
example.json
// ✅ 有效的 JSON(没有尾随逗号)
{
"name": "Alice",
"age": 30
}
发出 HTTP 请求时得到空响应
如果我们在发出 API 请求时遇到错误,请确保响应在解析之前具有 application/json
内容类型标头。
import requests
def make_request():
response = requests.delete('https://example.com/api/users/2')
print('response: 👉️', response) # response: 👉️ <Response [204]>
print('response.text: 👉️', response.text) # response.text: 👉️ ""
# response.status_code: 👉️ 204
print('response.status_code: 👉️', response.status_code)
print('response.headers: 👉️', response.headers)
if (response.status_code != 204
and 'content-type' in response.headers
and 'application/json' in response.headers['content-type']):
parsed = response.json()
print('✅ parsed response: 👉️', parsed)
else:
# 👇️ this runs
print('⛔️ conditions not met')
make_request()
该示例使用 requests
包并发出 HTTP DELETE
请求,该请求返回 204 状态(无内容)。
尝试像解析 JSON 一样解析空响应会引发 JSONDecodeError
,因此我们必须检查:
响应状态不是 204(无内容)。
响应头字典有一个内容类型键。
内容类型键的值为
application/json
。
这样我们就可以确定服务器在尝试使用 reponse.json()
方法(如果使用请求)或 json.loads(my_json_str)
解析它之前向我们发送了一个有效的 JSON 响应。
确保 API 不会以不正确的 Content-Type 响应
如果服务器向我们发送了一个空响应或响应不是 application/json
类型,我们将收到 JSONDecodeError
。
我们不能尝试像解析 JSON 一样解析 text/html
或 XML 响应(或空响应)。
尝试读取一个空的 JSON 文件或错误地读取一个 JSON 文件
该错误通常是在以下情况下引起的:
试图错误地读取 JSON 文件。
尝试读取一个空的 JSON 文件。
尝试读取包含无效 JSON 的 JSON 文件。
我们可以使用 json.load()
方法将 JSON 文件反序列化为 Python 对象。
import json
file_name = 'example.json'
with open(file_name, 'r', encoding='utf-8') as f:
my_data = json.load(f) # 👈️ 使用 load() 解析 JSON
print(my_data) # 👉️ {'name': 'Alice', 'age': 30}
该示例假定在同一目录中有一个名为 example.json 的文件。
example.json
{"name": "Alice", "age": 30}
确保我们正在读取的文件不为空,因为这通常会导致错误。
使用 try/except 语句来处理潜在的错误
如果我们的文件可能包含无效的 JSON,请使用 try/except
语句来处理错误。
假设我们有以下 JSON 文件。
example.json
{
"name": "Alice",
'age': 30
}
请注意,age 属性是单引号的,这使得 JSON 无效。
下面是我们如何使用 try/except
语句来处理错误。
import json
file_name = 'example.json'
with open(file_name, 'r', encoding='utf-8') as f:
try:
my_data = json.load(f) # 👈️ 使用 load() 解析 JSON
print(my_data)
except BaseException as e:
print('The file contains invalid JSON')
我们尝试从文件中解析 JSON 数据,但文件包含无效的 JSON,因此引发异常,然后在 except 块中处理。
确保不将文件路径传递给 json.loads()
错误的另一个常见原因是在尝试从 JSON 文件读取时将文件路径传递给 json.loads()
方法。
import json
file_name = 'example.json'
with open(file_name, 'r', encoding='utf-8') as f:
# ⛔️ json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
my_data = json.loads(file_name) # 👈️ incorrectly passed file path
print(my_data) # 👉️ {'name': 'Alice', 'age': 30}
json.load
方法用于将文件反序列化为 Python 对象,而 json.loads
方法用于将 JSON 字符串反序列化为 Python 对象。
import json
file_name = 'example.json'
with open(file_name, 'r', encoding='utf-8') as f:
my_data = json.load(f) # ✅ 将文件对象传递给 json.load()
print(my_data) # 👉️ {'name': 'Alice', 'age': 30}
json.load()
方法需要一个包含实现.read()
方法的 JSON 文档的文本文件或二进制文件。
使用 json.loads() 手动调用 read() 方法
或者,我们可以手动调用文件对象的 read()
方法并使用 json.loads()
方法。
import json
file_name = 'example.json'
with open(file_name, 'r', encoding='utf-8') as f:
# 👇️ 确保调用 read()
my_data = json.loads(f.read())
print(my_data) # 👉️ {'name': 'Alice', 'age': 30}
print(type(my_data)) # 👉️ <class 'dict'>
上面的示例实现了相同的结果,但是我们没有依赖 json.load() 方法为我们调用文件对象上的 read() ,而是手动执行它并使用 json.loads() 方法。
json.loads()
方法基本上帮助我们从 JSON 字符串加载 Python 本机对象(例如字典或列表)。
在使用 json.loads() 之前尝试让你的 JSON 有效
如果我们需要在使用 json.loads()
方法之前使您的 JSON 有效,我们可以尝试使用 str.replace()
方法。
下面是一个示例 JSON 文件,其中包含使 JSON 无效的单引号属性。
example.json
{
"name": "Alice",
'age': 30
}
下面是我们如何使用 str.replace()
方法将字符串中的单引号替换为双引号。
import json
file_name = 'example.json'
with open(file_name, 'r', encoding='utf-8', errors='ignore') as f:
a_str = f.read()
# {
# "name": "Alice",
# 'age': 30 👈️ note single quotes
# }
print(a_str)
# ✅ 用双引号替换单引号
valid_json = a_str.replace("'", '"')
result = json.loads(valid_json)
print(result) # {'name': 'Alice', 'age': 30}
print(result['name']) # Alice
print(result['age']) # 30
str.replace
方法返回字符串的副本,其中所有出现的子字符串都被提供的替换项替换。
该方法采用以下参数:
old 字符串中我们要替换的子串
new 替换每次出现的 old
count 仅替换第一个 count 出现(可选)
我们使用 replace()
方法将字符串中所有出现的单引号替换为双引号。
这使得 JSON 有效,因此我们可以安全地使用 json.loads()
方法。
JSONEncoder 类默认支持以下对象和类型的转换。
Python | JSON |
---|---|
Python | JSON |
dict | object |
list, tuple | array |
str | string |
int、float、int 和 float 派生枚举 | number |
True | true |
False | false |
None | null |
通常导致错误的事情
最常见的错误原因是:
尝试解析无效的 JSON 值(例如单引号或尾随逗号)。
从远程服务器(例如 204 或 404)获取空响应并尝试将其作为 JSON 进行解析。
尝试像解析 JSON 一样解析具有不同内容类型(例如文本/html)的响应。
尝试错误地读取 JSON 文件或尝试解析空 JSON 文件的内容。
来源:https://blog.csdn.net/fengqianlang/article/details/129674294


猜你喜欢
- 面试题:索引是什么?索引的优点?索引的缺点?在建立索引的时候都有哪些需要考虑的因素呢?为数据表建立索引的原则有哪些?什么是索引覆盖?非聚簇索
- 很多人都听过WAMP这个词吧,首先来看WAMP是什么意思?Windows下的Apache+MySQL+PHP,称为WAMP。属于WAMP环境
- 相信现在很多人都喜欢玩王者荣耀这款手游,里面好看的皮肤令人爱不释手。那么你有没有想过把王者荣耀高清皮肤设置为壁纸,像下面这样今天就来教大家如
- 1 abstract验证码作为一种自然人的机器人的判别工具,被广泛的用于各种防止程序做自动化的场景中。传统的字符型验证安全性已经名存实亡的情
- echo是PHP语句, print和print_r是函数,语句没有返回值,函数可以有返回值(即便没有用) print只
- 1.什么是property简单地说就是一个类里面的方法一旦被@property装饰,就可以像调用属性一样地去调用这个方法,它能够简化调用者获
- 按照惯例,年底的淘宝的确是到了“需要改版的时候”。这次新版的淘宝首页上线,乍看并没有多少夺人眼球的地方,但仔细揣摩其中的细节,还是发现了不少
- 最近用sysbench进行了较多的性能测试,也总结一下它的特点和用法和需要注意的事项。sysbench是一个多线程性能测试工具,可以进行CP
- 打算学习linux和考一下认证。学习HCIA-AI实验手册发现的小问题和记录贴,防止自己忘。我不知道这个手册是不是公开的,你们自己去华为下载
- 一、前言程序的性能也是非常关键的指标,很多时候你的代码跑的快,更能够体现你的技术。最近发现很多小伙伴在性能分析的过程中都是手动打印运行时间的
- 下面我挑选出的这几个技巧常常会被人们忽略,但它们在日常编程中能真正的给我们带来不少帮助。 1. 字典推导(Dictionary compre
- 成功解决NLTK包的安装错误创建环境NLP_Pre_trainl环境conda create -n NLP_Pre_train python
- 刚才画散点图要用到图例,可是matplotlib.pyplot.plot(x,y,'.')画出的散点图中图例是两个点(因为p
- 1、为什么需要自变量选择?一个好的回归模型,不是自变量个数越多越好。在建立回归模型的时候,选择自变量的基本指导思想是少而精。丢弃了一些对因变
- 在使用mybatis或者mybatis-plus时候,有些时候会出现数据库的字段名和实体类的字段名不一致的情况,如果运行那么这个字段就会无法
- 所有的前提都需要获取到root权限1.结束mysql进程//Linuxsudo services mysql stop//Macbrew s
- Dataframe使用loc取某几行几列的数据:print(df.loc[0:4,['item_price_level',&
- 当然是可以的,而且非常简单,今天就教大家在ASP中不用模板生成HTML静态页的方法。这里假设有一个htmer.asp动态页面,你想把它生成为
- 1、半开放socket利用shutdown()函数使socket双向数据传输变为单向数据传输。shutdown()需要一个单独的参数,该参数
- 导语大家好,我是栗子同学!今天给大家分享一个好玩的东西让时光倒流——当当当,其实就是让视频倒放而已正