2010-10-02 28 views
29

¿Es posible convertir una cadena json (por ejemplo, la devuelta por el servicio json de búsqueda de twitter) en objetos de cadena simples? He aquí una pequeña representación de datos devueltos por el servicio JSON:convertir una cadena json al objeto python

{ 
results:[...], 
"max_id":1346534, 
"since_id":0, 
"refresh_url":"?since_id=26202877001&q=twitter", 
. 
. 
. 
} 

Digamos que de alguna manera puedo almacenar el resultado en una variable, por ejemplo, obj. Estoy buscando para obtener los valores apropiados como los siguientes:

print obj.max_id 
print obj.since_id 

He intentado usar simplejson.load() y json.load() pero me dio un error diciendo 'str' object has no attribute 'read'

Respuesta

65

He intentado usar simplejson.load() y json.load() pero me dio un error diciendo 'str' object has no attribute 'read'

Para cargar desde una cadena, utilice json.loads() (nótese la 's').

Más eficientemente, omita el paso de leer la respuesta en una cadena, y simplemente pase la respuesta a json.load().

+0

oh, no sé que consigo un diccionario. De todos modos, está bien por el momento ... – deostroll

0

si usted no sabe si los datos van a ser un archivo o una cadena .... usar

import StringIO as io 
youMagicData={ 
results:[...], 
"max_id":1346534, 
"since_id":0, 
"refresh_url":"?since_id=26202877001&q=twitter", 
. 
. 
. 
} 

magicJsonData=json.loads(io.StringIO(str(youMagicData)))#this is where you need to fix 
print magicJsonData 
#viewing fron the center out... 
#youMagicData{}>str()>fileObject>json.loads 
#json.loads(io.StringIO(str(youMagicData))) works really fast in my program and it would work here so stop wasting both our reputation here and stop down voting because you have to read this twice 

de https://docs.python.org/3/library/io.html#text-i-o

json.loads del pitón incorporado en las bibliotecas, JSON .loads requiere un objeto de archivo y no comprueba qué se pasó, por lo que aún llama a la función de lectura sobre lo que pasaste porque el objeto de archivo solo da datos cuando llamas a read(). Entonces, como la clase de cadena incorporada no tiene la función de lectura, necesitamos un contenedor. Así que la función StringIO.StringIO en pocas palabras, las subclases de la clase de cadena y la clase de archivo y el mallado del funcionamiento interno oye mi reconstrucción de bajo nivel https://gist.github.com/fenderrex/843d25ff5b0970d7e90e6c1d7e4a06b1 así que al final de todo eso es como escribir un archivo RAM y ejecutarlo en una línea. ...

0
magicJsonData=json.loads(io.StringIO((youMagicData).decode("utf-8")) 
print(magicJsonData) 

la cadena JSON desde cualquier servidor o solicitud http es de tipo array de bytes para convertirlos en al cadena, (ya que la pregunta es sobre el conjunto de bytes de regresar de una petición del servidor, ¿verdad?)

res = json.loads((response.content).decode("utf-8")) 
print(res) 

aquí el response.content puede ser una matriz de bytes o cualquier cadena devuelta desde la solicitud del servidor que se decodifica en formato de cadena (utf-8) y se devuelve como matriz de python.

O simplemente utilizar un bytearray pero el uso de json.load lugar json.loads