¿Cómo convertir datos JSON en un objeto Python?

Resuelto Sai Krishna asked hace 13 años • 32 respuestas

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.POSTcontiene 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?
Sai Krishna avatar Jul 05 '11 14:07 Sai Krishna
Aceptado

ACTUALIZAR

Con Python3, puedes hacerlo en una línea, usando SimpleNamespacey 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 namedtupley 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 namedtupleel renameparámetro .

DS. avatar Apr 08 '2013 14:04 DS.

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)
cmaluenda avatar Feb 05 '2015 19:02 cmaluenda