Recibo un error Expecting value: line 1 column 1 (char 0)
al intentar decodificar JSON.
La URL que uso para la llamada API funciona bien en el navegador, pero da este error cuando se realiza a través de una solicitud curl. El siguiente es el código que uso para la solicitud curl.
El error ocurre en return simplejson.loads(response_json)
response_json = self.web_fetch(url)
response_json = response_json.decode('utf-8')
return json.loads(response_json)
def web_fetch(self, url):
buffer = StringIO()
curl = pycurl.Curl()
curl.setopt(curl.URL, url)
curl.setopt(curl.TIMEOUT, self.timeout)
curl.setopt(curl.WRITEFUNCTION, buffer.write)
curl.perform()
curl.close()
response = buffer.getvalue().strip()
return response
Rastreo completo:
Rastrear:
File "/Users/nab/Desktop/myenv2/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
111. response = callback(request, *callback_args, **callback_kwargs)
File "/Users/nab/Desktop/pricestore/pricemodels/views.py" in view_category
620. apicall=api.API().search_parts(category_id= str(categoryofpart.api_id), manufacturer = manufacturer, filter = filters, start=(catpage-1)*20, limit=20, sort_by='[["mpn","asc"]]')
File "/Users/nab/Desktop/pricestore/pricemodels/api.py" in search_parts
176. return simplejson.loads(response_json)
File "/Users/nab/Desktop/myenv2/lib/python2.7/site-packages/simplejson/__init__.py" in loads
455. return _default_decoder.decode(s)
File "/Users/nab/Desktop/myenv2/lib/python2.7/site-packages/simplejson/decoder.py" in decode
374. obj, end = self.raw_decode(s)
File "/Users/nab/Desktop/myenv2/lib/python2.7/site-packages/simplejson/decoder.py" in raw_decode
393. return self.scan_once(s, idx=_w(s, idx).end())
Exception Type: JSONDecodeError at /pricemodels/2/dir/
Exception Value: Expecting value: line 1 column 1 (char 0)
print repr(response_json)
te dice que te están pasando.loads()
?simplejson
cuando puedes usar stdlibjson
(que es la misma biblioteca quesimplejson
)?web_fetch()
llamada falló.pycurl
.requests
ofrece una API mucho más fácil, especialmente cuando se trata de depurar lo que está sucediendo. A menos que tenga que tener específicamente una versión más nueva de lasimplejson
biblioteca, solo quédesejson
y le ahorrará una dependencia para administrar.response_json
el valor de retorno de.json()
? Entonces ya ha descodificado los datos y ya no necesita usarlosjson.loads()
.response
lo descifró para ti.Respuestas:
Para resumir la conversación en los comentarios:
No es necesario usar la
simplejson
biblioteca, la misma biblioteca se incluye con Python como eljson
módulo.No es necesario decodificar una respuesta de UTF8 a unicode, el método
simplejson
/json
.loads()
puede manejar los datos codificados de UTF8 de forma nativa.pycurl
tiene una API muy arcaica. A menos que tenga un requisito específico para usarlo, hay mejores opciones.requests
ofrece la API más amigable, incluida la compatibilidad con JSON. Si puede, reemplace su llamada con:fuente
requests
! El rastro parece sugerir querequests
usoscomplexjson
, que usossimplejson
. Extraño.simplejson
si están disponibles; algunas personas quieren usar la última versión de simplejson en lugar de la que se incluye con Python stdlib.simplejson
usa el integradojson
debajo del capó, pero da errores más descriptivos. En este caso, usarjson
solo le daría un genéricoValueError: No JSON object could be decoded
.u''
). TuJSONDecodeError
le dice que muchos datos se analizaron con éxito antes de que se produjera un error; eso puede ser porque hay datos no válidos en ese punto (documento JSON malformado o dañado) o porque los datos se truncaron.Verifique el cuerpo de datos de respuesta, si hay datos reales y si un volcado de datos parece estar bien formateado.
En la mayoría de los casos, su
json.loads
-JSONDecodeError: Expecting value: line 1 column 1 (char 0)
de error se debe a:En última instancia, el error le dice que en la primera posición la cadena ya no se ajusta a JSON.
Como tal, si el análisis falla a pesar de tener un cuerpo de datos que se parece a JSON a primera vista, intente reemplazar las comillas del cuerpo de datos:
Nota: las comillas dentro de los datos se deben escapar correctamente
fuente
requests.get(url).json()
Just Works, el JSON tampoco está mal formado.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
ocurre específicamente cuando se pasa una cadena vacía a decodificación jsonJSONDecodeError: Expecting value: line 1 column 1 (char 0)
también ocurre cuando la primera línea en la respuesta json no es válida. Ejemplo de respuesta al ejecutar unaz cli
comando es["WARNING: The default kind for created storage account will change to 'StorageV2' from 'Storage' in the future", '{',
. Esto me dio el error que me llevó aquí. El resto de la respuesta ES un objeto json válido. Solo esa primera línea rompe las cosas.¡Con la
requests
libJSONDecodeError
puede ocurrir cuando tiene un código de error http como 404 e intenta analizar la respuesta como JSON!Primero debe verificar 200 (OK) o dejar que aumente en caso de error para evitar este caso. Desearía que fallara con un mensaje de error menos críptico.
NOTA : como Martijn Pieters declaró en los comentarios, los servidores pueden responder con JSON en caso de errores (depende de la implementación), por lo que verificar el
Content-Type
encabezado es más confiable.fuente
Creo que vale la pena mencionar que en los casos en que analiza el contenido de un archivo JSON en sí mismo, las comprobaciones de sanidad pueden ser útiles para asegurarse de que realmente está invocando
json.loads()
el contenido del archivo, a diferencia de la ruta del archivo de ese JSON :Me da un poco de vergüenza admitir que esto puede suceder a veces:
fuente
json.load()
en su lugar.Verifique el formato de codificación de su archivo y use el formato de codificación correspondiente mientras lee el archivo. Resolverá tu problema.
fuente
encoding='utf-8'
, así que supongo que a veces necesitas probar algunas cosas.Muchas veces, esto se debe a que la cadena que está intentando analizar está en blanco:
Puede remediar comprobando si
json_string
está vacío de antemano:fuente
response.read()
y luego me desanimé cuando otra llamada resultó enExpecting value: line 1
etc. Se eliminó la declaración de depuración y se resolvió el problema.Puede haber 0 incrustados, incluso después de llamar a decode (). Utilice replace ():
fuente
Tuve exactamente este problema usando las solicitudes. Gracias a Christophe Roussy por su explicación.
Para depurar, usé:
Estaba recibiendo una respuesta 404 de la API.
fuente
response.status_code
oprint(response.status_code)
.Estaba teniendo el mismo problema con las solicitudes (la biblioteca de Python). Resultó ser el
accept-encoding
encabezado.Se estableció de esta manera:
'accept-encoding': 'gzip, deflate, br'
Simplemente lo eliminé de la solicitud y dejé de recibir el error.
fuente
Para mí, no estaba usando autenticación en la solicitud.
fuente
Para mí, el servidor respondía con algo diferente a 200 y la respuesta no tenía formato json. Terminé haciendo esto antes del análisis json:
fuente
Encontré el mismo problema, mientras imprimía la cadena json abierta desde un archivo json, encontré que la cadena json comienza con 'ï »¿', que al hacer un poco de investigación se debe a que el archivo se decodifica por defecto con UTF-8, y Al cambiar la codificación a utf-8-sig, la marca se elimina y se carga json sin problema:
fuente
Si es usuario de Windows, la API Tweepy puede generar una línea vacía entre los objetos de datos. Debido a esta situación, puede obtener el error "JSONDecodeError: valor esperado: línea 1 columna 1 (char 0)". Para evitar este error, puede eliminar líneas vacías.
Por ejemplo:
Referencia: la API de transmisión de Twitter proporciona JSONDecodeError ("Valor esperado", s, err.value) de Ninguno
fuente
Simplemente verifique si la solicitud tiene un código de estado 200. Entonces, por ejemplo:
fuente
Recibí dicho error en la respuesta de una API web basada en Python
.text
, pero me trajo aquí, por lo que esto puede ayudar a otros con un problema similar (es muy difícil filtrar la respuesta y solicitar problemas en una búsqueda cuando se usarequests
...)El uso
json.dumps()
del argumento de solicituddata
para crear una cadena de JSON con escape correcto antes de PUBLICAR me solucionó el problemafuente