Это может быть решение для вас, используя встроенную библиотеку JSON Python, которая использует возможности Python для глотания словарей в качестве аргументов ключевых слов.
Я определил классы в Python, как я ожидал бы, основываясь на вашей схеме. В определении класса пользователя я разрешаю адрес как фактический адресный объект, список (преобразованный из массива JSON) или словарь (преобразованный из объекта JSON).
class Address(object):
def __init__(self, addressFirstLine, city, pincode):
self.addressFirstLine = addressFirstLine
self.city = city
self.pincode = pincode
class User(object):
def __init__(self, firstName, lastName, address):
self.firstName = firstName
self.lastName = lastName
if isinstance(address, Address):
self.address = address
elif isinstance(address, list):
self.address = Address(*address)
elif isinstance(address, dict):
self.address = Address(**address)
else:
raise TypeError('address must be provided as an Address object,'
' list, or dictionary')
Я использую встроенный в Python JSon библиотеку, чтобы преобразовать JSON строку, представленную в словарь, а затем использовать этот словарь, чтобы создать пользовательский объект. Как вы можете видеть ниже, user.address является фактическим объектом Address (я определил пользователя и адрес внутри файла user_address.py, следовательно, префикс).
>>> import json
>>> user_dict = json.loads('{
"firstName" : "Zen", "lastName" : "Coder",
"address" : {
"addressFirstLine" : "High st, Point place",
"city" : "Wisconcin",
"pincode" : "4E23C"}
}')
>>> from user_address import User
>>> user = User(**user_dict)
>>> user
<user_address.User at 0x1035b4190>
>>> user.firstName
u'Zen'
>>> user.lastName
u'coder'
>>> user.address
<user_address.Address at 0x1035b4710>
>>> user.address.addressFirstLine
u'High st, Point place'
>>> user.address.city
u'Wisconcin'
>>> user.address.pincode
u'4E23C'
Эта реализация также поддерживает список аргументов адреса, а не словарь. Он также вызывает описательную ошибку, если передан неподдерживаемый тип.
>>> user_dict = json.loads('{
"firstName" : "Zen", "lastName" : "coder",
"address" : ["High st, Point place", "Wisconcin", "4E23C"]
}')
>>> user = User(**user_dict)
>>> user.address
<user_address.Address at 0x10ced2d10>
>>> user.address.city
u'Wisconcin'
>>> user_dict = json.loads('{
"firstName" : "Zen", "lastName" : "coder",
"address" : "bad address"
}')
TypeError: address must be provided as an Address object, list, or dictionary
Этот другой ответ также говорит о преобразовании Python Dict в объект Python, с более абстрактным подходом: Convert Python dict to object
Что строка JSON выглядеть? –
просто добавил, что JSON будет выглядеть после сериализации с использованием Gson в Java. см. правки. – zenCoder
Как насчет простого написания пользовательского classemethod '.fromJSON' на обоих этих классах? – freakish