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?

FunnyChef
fuente
10
Tenga en cuenta que desde Python 3.6 esto ya no es un problema
Ikar Pohorský

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"]))
Neil
fuente
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.

wim
fuente
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