2013-04-02 1 views
3

Я определил два класса в Java. Давайте назовем их «User» и «Адрес»Как преобразовать сериализованный JSON, сгенерированный в Java, в сложный объект в Python?

class Address { 
    String addressFirstLine; 
    String city; 
    String pincode; 

    // Getters/setters for all attributes 
} 

class User { 
    String firstName; 
    String lastName; 
    Address address; 

    // Getters/setters for all attributes 
} 

Я создал объект класса пользователя и сериализовать его с помощью библиотеки Gson.

JSON строка выглядит примерно так:

{"firstname":"Zen","lastName":"coder", "Address":{"addressFirstLine":"High st, Point place","city":"Wisconcin","pincode":"4E23C"}} 

Теперь эта строка отправляется в приложение питона, которые имеют те же два определения класса «User» и «Адрес» определяется так же, как в Java выше.

Я попытался десериализовать json для объекта python, используя jsonpickle. Я могу десериализовать простые объекты с помощью jsonpickle, но не сложных объектов.

Может ли кто-нибудь предложить способ обойти это?

+0

Что строка JSON выглядеть? –

+0

просто добавил, что JSON будет выглядеть после сериализации с использованием Gson в Java. см. правки. – zenCoder

+0

Как насчет простого написания пользовательского classemethod '.fromJSON' на обоих этих классах? – freakish

ответ

1

Это может быть решение для вас, используя встроенную библиотеку 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

+0

Большое спасибо за пример. Похоже на правильный подход. Прежде чем отметить его как ответ, не могли бы вы сказать мне, будет ли вышеприведенный подход работать, если «адрес» был массивом типа Address? – zenCoder

+0

Это не будет работать в настоящее время, но я могу изменить его, чтобы делать то, что, как я думаю, вы спрашиваете. Будет ли это примером JSON в этом случае? {«firstName»: «Zen», «lastName»: «coder», «address»: [«High st, Point place», «Wisconcin», «4E23C»]} Если нет, предоставьте мне пример. – Jacinda

+0

Обновлено на основе того, что, я думаю, вы спрашивали о массивах. Дай мне знать, если это то, о чем тебе интересно. – Jacinda

Смежные вопросы