TypeError: el objeto JSON debe ser str, no 'bytes'


81

Tengo el siguiente código muy básico que lanza; TypeError: the JSON object must be str, not 'bytes'

import requests
import json

url = 'my url'
user = 'my user'
pwd = 'my password'

response = requests.get(url, auth=(user, pwd))

if(myResponse.ok):
    Data = json.loads(myResponse.content)

Intento configurar la decodificación para la variable de datos, de la siguiente manera, pero arroja el mismo error; jData = json.loads(myResponse.content).decode('utf-8')

¿Alguna sugerencia?


Respuestas:


139
json.loads(myResponse.content.decode('utf-8'))

Lo pones en el orden equivocado, error inocente.


(Respuesta en profundidad). Como lo señaló cortésmente wim, en algunos casos raros, podrían optar por UTF-16 o UTF-32. Estos casos serán menos comunes ya que los desarrolladores, en ese escenario estarían decidiendo conscientemente tirar un valioso ancho de banda. Por lo tanto, si tiene problemas de codificación, puede cambiar utf-8 a 16, 32, etc.

Hay un par de soluciones para esto. Puede usar la función incorporada de la solicitud .json():

myResponse.json()

O puede optar por la detección de personajes a través de chardet. Chardet es una biblioteca desarrollada en base a un estudio. La biblioteca tiene una función: detect. Detect puede detectar las codificaciones más comunes y luego usarlas para codificar su cadena con.

import chardet
json.loads(myResponse.content.decode(chardet.detect(myResponse.content)["encoding"]))

31

Deje que las solicitudes lo descodifiquen por usted:

data = response.json()

Esto verificará los encabezados (tipo de contenido) y la codificación de respuesta, detectando automáticamente cómo decodificar el contenido correctamente.


1
Estoy probando su método pero obtengo un error: el objeto 'InMemoryUploadedFile' no tiene atributo 'json', esto es de request.FILES ['file']. Json ()
Manza

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.