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)