2010-10-02 5 views
29

Est-il possible de convertir une chaîne json (par exemple celle renvoyée par le service json de recherche twitter) en objets chaîne simples. Voici une petite représentation des données renvoyées par le service JSON:convertir une chaîne json en objet python

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

Disons que je stocke en quelque sorte le résultat dans une variable, disons, obj. Je cherche à obtenir des valeurs appropriées comme la manière suivante:

print obj.max_id 
print obj.since_id 

J'ai essayé d'utiliser simplejson.load() et json.load() mais il m'a donné une erreur en disant 'str' object has no attribute 'read'

Répondre

65

J'ai essayé d'utiliser simplejson.load() et json.load() mais m'a donné une erreur en disant 'str' object has no attribute 'read'

Pour charger à partir d'une chaîne, utilisez json.loads() (notez le « s »).

Plus efficacement, passez l'étape de lecture de la réponse dans une chaîne et passez la réponse à json.load().

+0

oh, ne savais pas que je reçois un dictionnaire. En tout cas c'est bien pour le moment ... – deostroll

0

si vous ne savez pas si les données seront un fichier ou d'une chaîne .... utiliser

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 du python intégré dans les bibliothèques, JSON .loads requiert un objet fichier et ne vérifie pas ce qu'il a transmis, il appelle toujours la fonction read sur ce que vous avez passé car l'objet file ne donne des données que lorsque vous appelez read(). Donc, parce que la classe de chaînes intégrée n'a pas la fonction de lecture, nous avons besoin d'un wrapper. Donc, la fonction StringIO.StringIO en bref, sous-classe la classe de chaînes et la classe de fichier et maillage des rouages ​​internes entend mes faibles détails reconstruire https://gist.github.com/fenderrex/843d25ff5b0970d7e90e6c1d7e4a06b1 donc à la fin de tout cela est comme écrire un fichier RAM et jsoning sur une ligne. ...

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

la chaîne JSON de tout serveur de requêtes ou http est d'un tableau type octet pour les convertir à sTRING, (puisque la question est sur le tableau d'octets est retourné à partir d'une demande de serveur, non?)

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

ici le response.content peut être un tableau d'octets ou toute chaîne renvoyée par la requête du serveur qui est décodée en format de chaîne (utf-8) et renvoyée en tant que tableau python.

Ou tout simplement utiliser un bytearray mais utiliser json.load json.loads à la place

Questions connexes