gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:09:36 28 4
gpt4 key购买 nike

我在 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 字符串类似于:

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

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

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

谁能提出解决这个问题的方法?

最佳答案

对于使用 Python 内置 JSON 库的您来说,这可能是一个解决方案,它利用 Python 将字典作为关键字参数的能力。

我根据您的大纲,按照我的预期在 Python 中定义了类。在 User 类定义中,我允许将地址作为实际地址对象、列表(从 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 的文件中定义了 User 和 Address,因此是前缀)。

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

关于java - 如何将 Java 中生成的序列化 JSON 转换为 Python 中的复杂对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15767244/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com