Resolver Raise JSONDecodeError(esperando valor, S, err.value) de ninguno en Python

Olorunfemi Akinlua 10 octubre 2023
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 Akinlua avatar Olorunfemi Akinlua avatar

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.

LinkedIn

Artículo relacionado - Python Error