objeto limpiar libreria instalar ejemplo dumps dinamico dict create crear convertir python json python-3.x encoding urlopen

limpiar - python json ejemplo



Permitir que el objeto JSON acepte bytes o permita que la urlpen cadenas de salida (11)

Con Python3 estoy solicitando un documento json a partir de una URL.

response = urllib.request.urlopen(request)

El objeto de response es un archivo como objeto con métodos de read y read .

Normalmente, se puede crear un objeto JSON con un archivo abierto en modo texto.

obj = json.load(fp)

Lo que me gustaría hacer es:

obj = json.load(response)

Sin embargo, esto no funciona ya que urlopen devuelve un objeto de archivo en modo binario.

Un trabajo alrededor es, por supuesto:

str_response = response.readall().decode(''utf-8'') obj = json.loads(str_response)

pero esto se siente mal ...

¿Hay alguna forma mejor de que pueda transformar un objeto de archivo de bytes en un objeto de archivo de cadena? ¿O me faltan parámetros para urlopen o json.load para dar una codificación?


Acabo de encontrar este sencillo método para crear contenido HttpResponse como json

import json request = RequestFactory() # ignore this, this just like your request object response = MyView.as_view()(request) # got response as HttpResponse object response.render() # call this so we could call response.content after json_response = json.loads(response.content.decode(''utf-8'')) print(json_response) # {"your_json_key": "your json value"}

Espero que te ayude


Este funciona para mí, utilicé la biblioteca ''request'' con json() revise el doc en solicitudes para humanos

import requests url = ''here goes your url'' obj = requests.get(url).json()


Esto transmitirá los datos de bytes a json.

import io obj = json.load(io.TextIOWrapper(response))

io.TextIOWrapper es preferible al lector de módulos del códec. https://www.python.org/dev/peps/pep-0400/


HTTP envía bytes. Si el recurso en cuestión es texto, la codificación de caracteres normalmente se especifica, ya sea por el encabezado HTTP Content-Type o por otro mecanismo (un RFC, HTML meta http-equiv , ...).

urllib debe saber cómo codificar los bytes en una cadena, pero es demasiado ingenuo: es una biblioteca terriblemente poco desarrollada y poco pitthonic.

Dive Into Python 3 proporciona una descripción general de la situación.

Su "solución alternativa" está bien, aunque se sienta mal, es la forma correcta de hacerlo.


He llegado a la opinión de que la pregunta es la mejor respuesta :)

import json from urllib.request import urlopen response = urlopen("site.com/api/foo/bar").read().decode(''utf8'') obj = json.loads(response)


La biblioteca estándar maravillosa de Python para el rescate ...

import codecs reader = codecs.getreader("utf-8") obj = json.load(reader(response))

Funciona con py2 y py3.


Me encontré con problemas similares usando Python 3.4.3 y 3.5.2 y Django 1.11.3. Sin embargo, cuando actualicé a Python 3.6.1, los problemas desaparecieron.

Puede leer más sobre esto aquí: https://docs.python.org/3/whatsnew/3.6.html#json

Si no estás vinculado a una versión específica de Python, solo considera actualizar a 3.6 o posterior.


Para cualquier otra persona que intente resolver esto usando la biblioteca de requests :

import json import requests r = requests.get(''http://localhost/index.json'') r.raise_for_status() # works for Python2 and Python3 json.loads(r.content.decode(''utf-8''))


Si experimenta este problema mientras usa el microframework del matraz, puede hacer lo siguiente:

data = json.loads(response.get_data(as_text=True))

De los documentos : "Si as_text se establece en True, el valor devuelto será una cadena decodificada Unicode"


Su solución en realidad solo me salvó. Estaba teniendo muchos problemas para procesar la solicitud utilizando el marco Falcon. Esto funcionó para mí. Req siendo el formulario de solicitud curl pr httpie

json.loads(req.stream.read().decode(''utf-8''))


json.loads() siguiente programa para usar json.loads()

import urllib.request import json endpoint = ''https://maps.googleapis.com/maps/api/directions/json?'' api_key = ''AIzaSyABbKiwfzv9vLBR_kCuhO7w13Kseu68lr0'' origin = input(''where are you ?'').replace('' '',''+'') destination = input(''where do u want to go'').replace('' '',''+'') nav_request = ''origin={}&destination={}&key={}''.format(origin,destination,api_key) request = endpoint + nav_request **response = urllib.request.urlopen(request).read().decode(''utf-8'') directions = json.loads(response)** print(directions)