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

标签 java python json

我在 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/

相关文章:

javascript - 在 Node.js 套接字中写入和 'data' 事件

json - Twitter json 提要?

java - java中多个json转xml的高效处理

java - 如何升级Spring Tool Suite版本而不是重新安装?

python - 我如何获得图像识别的概率

python - 多进程模块中子进程的运行顺序

javascript - 从 API 获取 Json 以在 Gmap 中使用

java - getIntent() 在第一个主要 Activity 中返回什么?

java - Trim() 不适用于从控制台输入的字符串

Python 3 : in a text file, 获取字符串在其出现的 y 行中出现的 x 次