UPDATE
Avec Python3, vous pouvez le faire en une seule ligne, en utilisant SimpleNamespace
et object_hook
:
import json
from types import SimpleNamespace
data = '{"name": "John Smith", "hometown": {"name": "New York", "id": 123}}'
# Parse JSON into an object with attributes corresponding to dict keys.
x = json.loads(data, object_hook=lambda d: SimpleNamespace(**d))
print(x.name, x.hometown.name, x.hometown.id)
ANCIENNE RÉPONSE (Python2)
En Python2, vous pouvez le faire en une seule ligne, en utilisant namedtuple
et object_hook
(mais c'est très lent avec de nombreux objets imbriqués) :
import json
from collections import namedtuple
data = '{"name": "John Smith", "hometown": {"name": "New York", "id": 123}}'
# Parse JSON into an object with attributes corresponding to dict keys.
x = json.loads(data, object_hook=lambda d: namedtuple('X', d.keys())(*d.values()))
print x.name, x.hometown.name, x.hometown.id
ou, pour le réutiliser facilement :
def _json_object_hook(d): return namedtuple('X', d.keys())(*d.values())
def json2obj(data): return json.loads(data, object_hook=_json_object_hook)
x = json2obj(data)
Si vous voulez qu'il gère des clés qui ne sont pas de bons noms d'attributs, consultez la page suivante namedtuple
's rename
paramètre .
0 votes
En général, JSON est converti en listes ou en dicts. Est-ce ce que vous voulez ? Ou bien vous espérez convertir JSON directement en un type personnalisé ?
0 votes
Je veux le convertir en un objet, quelque chose auquel je peux accéder en utilisant le "." . Comme dans l'exemple ci-dessus -> reponse.name, response.education.id etc....
80 votes
Utilisation de
dict
est un moyen peu convaincant de faire de la programmation orientée objet. Les dictionnaires sont un très mauvais moyen de communiquer les attentes aux lecteurs de votre code. En utilisant un dictionnaire, comment pouvez-vous spécifier clairement et de manière réutilisable que certaines paires clé-valeur du dictionnaire sont requises, alors que d'autres ne le sont pas ? Qu'en est-il de la confirmation qu'une valeur donnée est dans la plage ou l'ensemble acceptable ? Qu'en est-il des fonctions spécifiques au type d'objet avec lequel vous travaillez (les méthodes) ? Les dictionnaires sont pratiques et polyvalents, mais trop de développeurs agissent comme s'ils avaient oublié que Python est un langage orienté objet pour une raison.3 votes
Il existe une bibliothèque python pour cela github.com/jsonpickle/jsonpickle (commentaire puisque la réponse se trouve trop bas dans le fil et ne sera pas accessible).