如何将Java中生成的序列化JSON转换成Python中的复杂对象?

2024-04-29 05:40:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我用Java定义了两个类。我们叫他们“用户”和“地址”

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
}

我创建了一个User类的对象,并使用Gson库将其序列化。在

JSON字符串类似于:

^{pr2}$

现在,这个字符串被发送到一个python应用程序,该应用程序具有与上面Java中定义的“User”和“Address”相同的两个类定义。在

我尝试过使用jsonpickle将json反序列化为python对象。我可以用jsonpickle反序列化简单对象,但不能反序列化复杂对象。在

有人能给我个办法吗?在


Tags: 对象字符串应用程序forstring序列化定义address
1条回答
网友
1楼 · 发布于 2024-04-29 05:40:50

这可能是使用Python内置JSON库的一个解决方案,该库利用Python将字典作为关键字参数摄取的能力。在

我在Python中定义了基于大纲的类。在User类定义中,我允许address作为实际的address对象、列表(从JSON数组转换)或dictionary(从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')

我使用内置的pythonjson库将您提供的json字符串转换为字典,然后使用该字典创建用户对象。如下图所示,用户地址是一个实际的Address对象(我在一个名为User的文件中定义了User和Address)_地址.py,因此有前缀)。在

^{pr2}$

此实现还支持地址参数列表,而不是字典。如果传递了不受支持的类型,也会引发描述性错误。在

>>> 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

相关问题 更多 >