JSONDecodeError: Valor esperado: línea 1 columna 1 (carácter 0)

Estoy recibiendo un error Expecting value: line 1 column 1 (char 0) cuando bash descodificar JSON.

La URL que uso para la llamada a la API funciona bien en el navegador, pero da este error cuando se realiza a través de una solicitud de curvatura. El siguiente es el código que uso para la solicitud de curvatura.

El error ocurre al 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) 

Para resumir la conversación en los comentarios:

  • No es necesario utilizar la biblioteca simplejson , ya que Python incluye la misma biblioteca que el módulo json .

  • No hay necesidad de decodificar una respuesta de UTF8 a Unicode, el simplejson / json .loads() puede manejar los datos codificados en 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, incluyendo soporte JSON. Si puede, reemplace su llamada con:

 import requests return requests.get(url).json() 

Verifique el cuerpo de datos de la respuesta, si los datos reales están presentes y un volcado de datos parece estar bien formateado.

En la mayoría de los casos, su json.loadsJSONDecodeError: Expecting value: line 1 column 1 (char 0) se debe a:

  • cita no conforme a JSON
  • Salida XML / HTML (es decir, una cadena que comienza con <), o
  • encoding de caracteres incompatibles

En última instancia, el error le indica que, en la primera posición, la cadena ya no cumple con JSON.

Como tal, si el análisis falla a pesar de tener un cuerpo de datos que parece JSON a primera vista, intente reemplazar las comillas del cuerpo de datos:

 import sys, json struct = {} try: try: #try parsing to dict dataform = str(response_json).strip("'<>() ").replace('\'', '\"') struct = json.loads(dataform) except: print repr(resonse_json) print sys.exc_info() 

Nota: las citas dentro de los datos deben ser correctamente escapadas

Con las requests puede producirse JSONDecodeError 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 por error para evitar este caso. Me gustaría que fallara con un mensaje de error menos críptico.

NOTA : como declaró Martijn Pieters en los servidores de comentarios, JSON puede responder en caso de errores (depende de la implementación), por lo que es más confiable verificar el encabezado Content-Type .

Puede haber 0 incrustados, incluso después de llamar a decode (). Utilice reemplazar ():

 import json struct = {} try: response_json = response_json.decode('utf-8').replace('\0', '') struct = json.loads(response_json) except: print('bad json: ', response_json) return struct 

Tuve exactamente este problema utilizando las solicitudes. Gracias a Christophe Roussy por su explicación.

Para depurar, utilicé:

 response = requests.get(url) logger.info(type(response)) 

Recibí una respuesta 404 de la API.

Estaba teniendo el mismo problema con las solicitudes (la biblioteca de python). Pasó a ser el encabezado de accept-encoding .

Se configuró de esta manera: 'accept-encoding': 'gzip, deflate, br'

Simplemente lo quité de la solicitud y dejé de recibir el error.

verifique el formato de encoding de su archivo y use el formato de encoding correspondiente mientras lee el archivo. Solucionará tu problema.

 with open("AB.json",encoding='utf-16', errors='ignore') as json_data: data = json.load(json_data, strict=False)