Resolver Raise JSONDecodeError(esperando valor, S, err.value) de ninguno en Python
Cuando trabaja con URL y API en Python, a menudo tiene que usar las bibliotecas urllib
y json
. Más importante aún, la biblioteca json
ayuda a procesar datos JSON, que es la forma predeterminada de transferir datos, especialmente con API.
Dentro de la librería json
, hay un método, loads()
, que devuelve el error JSONDecodeError
. En este artículo, discutiremos cómo resolver dichos errores y tratarlos adecuadamente.
Use intentar
para resolver elevar JSONDecodeError("Esperando valor", s, err.valor) de Ninguno
en Python
Antes de trabajar con JSON, a menudo teníamos que recibir datos a través del paquete urllib
. Sin embargo, cuando se trabaja con el paquete urllib, es importante comprender cómo importar dicho paquete a su código, ya que podría generar errores.
Para que podamos hacer uso del paquete urllib
, tenemos que importarlo. A menudo, las personas pueden importarlo como se muestra a continuación.
import urllib
queryString = {"name": "Jhon", "age": "18"}
urllib.parse.urlencode(queryString)
La salida del código anterior dará un 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'
La forma correcta de importar la urllib
se puede ver a continuación.
import urllib.parse
queryString = {"name": "Jhon", "age": "18"}
urllib.parse.urlencode(queryString)
Alternativamente, puede usar la palabra clave as
y su alias (a menudo más corto) para facilitar la escritura de su código Python.
import urllib.parse as urlp
queryString = {"name": "Jhon", "age": "18"}
urlp.urlencode(queryString)
Todo lo anterior funciona para solicitud
, error
y robotparser
:
import urllib.request
import urllib.error
import urllib.robotparser
Con estos errores comunes fuera del camino, podemos tratar más con la función que a menudo funciona con la biblioteca urllib
cuando se trabaja con URL que arrojan el error JSONDecodeError
, como se vio anteriormente, que es json.load()
función.
raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
El método load()
analiza la cadena JSON válida que recibe como argumento y la convierte en un diccionario de Python para su manipulación. El mensaje de error muestra que esperaba un valor JSON pero no lo recibió.
Eso significa que su código no analizó la cadena JSON ni analizó una cadena vacía en el método cargar ()
. Un fragmento de código rápido puede verificar esto fácilmente.
import json
data = ""
js = json.loads(data)
La salida del código:
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)
El mismo mensaje de error está presente y podemos determinar que el error provino de un argumento de cadena vacío.
Para un ejemplo más detallado, intentemos acceder a una API de Google Map y recopilar la ubicación del usuario, por ejemplo, EE. UU. o NG, pero no devuelve ningún valor.
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)
La salida del código:
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)
Obtuvimos el mismo error. Sin embargo, para detectar tales errores y evitar averías, podemos usar la lógica intentar/excepto
para salvaguardar nuestro código.
Por lo tanto, si la API no devuelve ningún valor JSON en un punto de solicitud, podemos devolver otra expresión y no un error.
El código anterior se convierte en:
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")
La salida del código cuando ingresamos la ubicación como US
:
Enter location: US
Retrieving http://maps.googleapis.com/maps/api/geocode/json?sensor=false&address=US
Returned 237 characters
no json returned
Debido a que no se devolvió ningún valor JSON, el código imprime “no se devolvió json”. Debido a que el error es más una falta de argumento que no se puede controlar, el uso de intentar/excepto
es importante.
Olorunfemi is a lover of technology and computers. In addition, I write technology and coding content for developers and hobbyists. When not working, I learn to design, among other things.
LinkedInArtículo relacionado - Python Error
- Administrar fallas de segmentación en Python
- Archivo <Stdin>, Línea 1, en <Módulo> Error en Python
- Arreglar AttributeError: el objeto 'generador' no tiene atributo 'siguiente' en Python
- Arreglar el comando cl.exe falló: no existe tal archivo o directorio en Windows
- Arreglar NameError: la variable no está definida en Python
- Arreglar Socket.Gaierror: [Errno 8] Nodename ni Servname proporcionado, o desconocido en Python