使用Python进行简单的JSON编码

2024-05-13 07:26:46 发布

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

我对python很陌生(我使用python 3),我正在尝试用一个字符串和两个列表作为JSon中的成员序列化一个类。我发现python standart中有一个json库,但似乎需要手动实现序列化方法。是否有一个JSon编码器,在这里我可以简单地传递一个对象,并以字符串形式接收序列化的对象,而不必实现序列化方法。 示例:

class MyClass:
    pass

if __name__ == '__main__':
    my_name = "me"
    my_list = {"one","two"}
    my_obj = MyClass()
    my_obj.name = my_name;
    my_obj.my_list = my_list


    serialized_object = JSONserializer.serialize(my_obj).

谢谢你。


Tags: 对象方法字符串namejsonobj列表序列化
3条回答

您希望json库如何知道如何序列化任意类?

在你的情况下,如果你的课程足够简单,你也许可以摆脱一些像

foo = FooObject() # or whatever
json_string = json.dumps(foo.__dict__)

只序列化对象的成员。

反序列化需要类似于

foo_data = json.loads(json_string)
foo = FooObject(**foo_data)

不知道什么是预先构建的,但是如果对象足够简单,可以编写一个。重写JSONEncoder中的默认方法以查看inspect.getmembers(obj)(inspect是在__dict__中获取属性集的更可读的方法)。

#!/usr/bin/env python3

import inspect
from json import JSONEncoder


class TreeNode:

    def __init__(self, value, left=None, right=None):
        self.value = value
        self.left = left
        self.right = right


class ObjectJSONEncoder(JSONEncoder):

    def default(self, reject):
        is_not_method = lambda o: not inspect.isroutine(o)
        non_methods = inspect.getmembers(reject, is_not_method)
        return {attr: value for attr, value in non_methods
                if not attr.startswith('__')}


if __name__ == '__main__':
    tree = TreeNode(42,
        TreeNode(24),
        TreeNode(242),
    )
    print(ObjectJSONEncoder().encode(tree))

更新:@Alexandre Deschamps说,对于某些输入,isroutine比is方法工作得更好。

那么JSONEncoder类呢?

更新

我一定跳过了关于类中包含的数据的部分。如果您希望对任意Python对象进行合理的序列化,而不需要扩展编码器,那么您可以使用^{}json的组合。酸洗时,使用protocol=0将数据序列化为人类可读的ASCII。

相关问题 更多 >