python 中解决 Raise JSONDecodeError(Expecting Value, S, err.value) From None
在 Python 中使用 URL 和 API 时,您通常必须使用 urllib 和 json 库。 更重要的是,json 库有助于处理 JSON 数据,这是传输数据的默认方式,尤其是使用 API 时。
在 json 库中,有一个方法,loads(),它返回 JSONDecodeError 错误。 在本文中,我们将讨论如何解决此类错误并进行适当的处理。
从 Python 中使用 try 的 None 中解决 raise JSONDecodeError("Expecting value", s, err.value)
在处理 JSON 之前,我们经常必须通过 urllib 包接收数据。 但是,在使用 urllib 包时,了解如何将此类包导入代码中非常重要,因为这可能会导致错误。
为了使用 urllib 包,我们必须导入它。 通常,人们可能会按如下方式导入它。
import urllib
queryString = { 'name' : 'Jhon', 'age' : '18'}
urllib.parse.urlencode(queryString)
上面代码的输出将给出一个 AttributeError:
Traceback (most recent call last):
File "c:\Users\akinl\Documents\HTML\python\test.py", line 3, in <module>
urllib.parse.urlencode(queryString)
AttributeError: module 'urllib' has no attribute 'parse'
导入urllib的正确方法如下所示。
import urllib.parse
queryString = {'name': 'Jhon', 'age': '18'}
urllib.parse.urlencode(queryString)
或者,您可以使用 as
关键字和别名(通常更短)来更轻松地编写 Python 代码。
import urllib.parse as urlp
queryString = {'name': 'Jhon', 'age': '18'}
urlp.urlencode(queryString)
以上所有内容都适用于请求、错误和 robotsparser:
import urllib.request
import urllib.error
import urllib.robotparser
解决了这些常见错误后,我们可以进一步处理在处理引发 JSONDecodeError 错误的 URL 时经常与 urllib 库一起使用的函数,如前所述,即 json.load()
函数。
raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
load()
方法解析作为参数接收的有效 JSON 字符串,并将其转换为 Python 字典以进行操作。 错误消息显示它需要一个 JSON 值,但没有收到。
这意味着您的代码没有解析 JSON 字符串或将空字符串解析到 load()
方法。 快速的代码片段可以轻松验证这一点。
import json
data = ""
js = json.loads(data)
代码的输出:
Traceback (most recent call last):
File "c:\Users\akinl\Documents\python\texts.py", line 4, in <module>
js = json.loads(data)
File "C:\Python310\lib\json\__init__.py", line 346, in loads
return _default_decoder.decode(s)
File "C:\Python310\lib\json\decoder.py", line 337, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "C:\Python310\lib\json\decoder.py", line 355, in raw_decode
raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
存在相同的错误消息,我们可以确定错误来自空字符串参数。
对于更详细的示例,让我们尝试访问 Google Map API 并收集用户位置,例如 US 或 NG,但它不会返回任何值。
import urllib.parse
import urllib.request
import json
googleURL = 'http://maps.googleapis.com/maps/api/geocode/json?'
while True:
address = input('Enter location: ')
if address == "exit":
break
if len(address) < 1:
break
url = googleURL + urllib.parse.urlencode({'sensor': 'false',
'address': address})
print('Retrieving', url)
uReq = urllib.request.urlopen(url)
data = uReq.read()
print('Returned', len(data), 'characters')
js = json.loads(data)
print(js)
代码的输出:
Traceback (most recent call last):
File "C:\Users\akinl\Documents\html\python\jsonArt.py", line 18, in <module>
js = json.loads(str(data))
File "C:\Python310\lib\json\__init__.py", line 346, in loads
return _default_decoder.decode(s)
File "C:\Python310\lib\json\decoder.py", line 337, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "C:\Python310\lib\json\decoder.py", line 355, in raw_decode
raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
我们得到了同样的错误。 然而,为了捕获此类错误并防止崩溃,我们可以使用 try/ except 逻辑来保护我们的代码。
因此,如果 API 在请求时未返回任何 JSON 值,我们可以返回另一个表达式而不是错误。
上面的代码就变成:
import urllib.parse
import urllib.request
import json
googleURL = 'http://maps.googleapis.com/maps/api/geocode/json?'
while True:
address = input('Enter location: ')
if address == "exit":
break
if len(address) < 1:
break
url = googleURL + urllib.parse.urlencode({'sensor': 'false',
'address': address})
print('Retrieving', url)
uReq = urllib.request.urlopen(url)
data = uReq.read()
print('Returned', len(data), 'characters')
try:
js = json.loads(str(data))
except:
print("no json returned")
当我们输入位置为 US 时代码的输出:
Enter location: US
Retrieving http://maps.googleapis.com/maps/api/geocode/json?sensor=false&address=US
Returned 237 characters
no json returned
由于没有返回 JSON 值,因此代码打印 no json returned。 因为错误更多的是无法控制的不存在参数,所以使用 try/ except
很重要。
相关文章
解决 Python中 Attempted Relative Import With No Known Parent Package 错误
发布时间:2023/07/04 浏览次数:134 分类:Python
-
对导入系统的充分了解足以防止此类错误,包括 ImportError: attemptsrelative import with noknownparent package。 通过错误消息可以轻松排除问题的根源。
Python 错误 TypeError: Unsupported Operand Type(s) for +: 'NoneType' and 'Int'
发布时间:2023/07/04 浏览次数:114 分类:Python
-
在 Python 中,当您将整数值与空值相加时,会出现 TypeError: unsupported operand type(s) for +: 'NoneType' and 'int' 。 我们将在本文中讨论 Python 错误以及如何解决它。
Python 中错误 ModuleNotFoundError: No Module Named Openpyxl
发布时间:2023/07/04 浏览次数:79 分类:Python
-
本文将讨论 Python 的 No module named 'openpyxl' 错误。 当我们导入的模块未安装或位于另一个目录中时,会出现 ModuleNotFoundError。
Python 错误 Error: Bash: Syntax Error Near Unexpected Token '('
发布时间:2023/07/04 浏览次数:147 分类:Python
-
本篇文章将讨论错误:Bash: syntax error near unexpected token '('。Python 错误:Bash: syntax error near unexpected token '('您的计算机上需要安装 Python,解释器才能查找并运行 Python 文件。
Python 中错误 CSV.Error: Line Contains Null Byte
发布时间:2023/07/04 浏览次数:111 分类:Python
-
在 Python 中创建 CSV 文件 Python 中的 _csv.Error: line contains NULL byte 错误 假设您在尝试读取 CSV 文件时收到 _csv.Error: line contains NULL byte,很可能是因为文件中存在一个或多个 NULL 字节。
Python 中错误 AttributeError: Module Urllib Has No Attribute Request
发布时间:2023/07/04 浏览次数:106 分类:Python
-
Python 将缓存导入,因为您正在使用导入的模块供其自身使用,使其成为对象的一部分。Python 中 AttributeError:module 'urllib' has no attribute 'request' 当您尝试通过导入 URL 库打开 URL 链接时,此错误是
Python 错误 ValueError: Cannot Convert Float NaN to Integer
发布时间:2023/05/31 浏览次数:116 分类:Python
-
本篇文章将介绍如何修复 ValueError: cannot convert float NaN to integer 。使用 fillna() 方法修复python错误 ValueError: cannot convert float NaN to integer
修复 Python 错误TypeError: Missing 1 Required Positional Argument
发布时间:2023/05/31 浏览次数:152 分类:Python
-
本篇文章将讨论 Python 中的 TypeError: missing 1 required positional argument: 'self' 错误以及我们如何解决它。让我们讨论引发此错误的情况。不在 Python 中实例化对象
Python 错误 OverflowError: Python Int Too Large to Convert to C Long
发布时间:2023/05/31 浏览次数:198 分类:Python
-
本篇文章将介绍 Python 中的 OverflowError: python int too large to convert to c long 错误。当算术结果超出数据类型的给定限制时,Python 中会引发 OverflowError。