UPDATE
Mit Python3 können Sie dies in einer Zeile tun, indem Sie SimpleNamespace
y 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)
ALTE ANTWORT (Python2)
In Python2 können Sie dies in einer Zeile tun, indem Sie namedtuple
y object_hook
(aber bei vielen verschachtelten Objekten ist es sehr langsam):
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
oder, um diese einfach wiederzuverwenden:
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)
Wenn Sie möchten, dass es mit Schlüsseln umgeht, die keine guten Attributnamen sind, sehen Sie sich namedtuple
's rename
Parameter .