¿Cómo convertir datos JSON en un objeto Python?
Quiero convertir datos JSON en un objeto Python.
Recibo objetos de datos JSON de la API de Facebook, que quiero almacenar en mi base de datos.
Mi vista actual en Django (Python) ( request.POST
contiene el JSON):
response = request.POST
user = FbApiUser(user_id = response['id'])
user.name = response['name']
user.username = response['username']
user.save()
- Esto funciona bien, pero ¿cómo manejo objetos de datos JSON complejos?
- ¿No sería mucho mejor si de alguna manera pudiera convertir este objeto JSON en un objeto Python para facilitar su uso?
Aceptado
ACTUALIZAR
Con Python3, puedes hacerlo en una línea, usando 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)
ANTIGUA RESPUESTA (Python2)
En Python2, puedes hacerlo en una línea, usando namedtuple
y object_hook
(pero es muy lento con muchos objetos anidados):
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
o, para reutilizar esto fácilmente:
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 desea que maneje claves que no son buenos nombres de atributos, consulte namedtuple
el rename
parámetro .
Podrías probar esto:
class User():
def __init__(self, name, username):
self.name = name
self.username = username
import json
j = json.loads(your_json)
u = User(**j)
Simplemente cree un nuevo objeto y pase los parámetros como un mapa.
También puedes tener un JSON con objetos:
import json
class Address():
def __init__(self, street, number):
self.street = street
self.number = number
def __str__(self):
return "{0} {1}".format(self.street, self.number)
class User():
def __init__(self, name, address):
self.name = name
self.address = Address(**address)
def __str__(self):
return "{0} ,{1}".format(self.name, self.address)
if __name__ == '__main__':
js = '''{"name":"Cristian", "address":{"street":"Sesame","number":122}}'''
j = json.loads(js)
print(j)
u = User(**j)
print(u)