使用Python轻松进行JSON编码

时间:2010-09-09 18:08:51

标签: python json serialization

我是python的新手(我使用python 3),我正在尝试使用一个字符串和两个列表作为JSon中的成员序列化一个类。我发现python标准中有一个json lib,但似乎我需要手动实现一个序列化方法。是否有一个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).

谢谢。

3 个答案:

答案 0 :(得分:4)

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

在你的情况下,如果你的课程足够简单,你可能会得到像

这样的东西
foo = FooObject() # or whatever
json_string = json.dumps(foo.__dict__)

只是序列化对象的成员。

反序列化需要类似

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

答案 1 :(得分:3)

不知道任何预先构建的内容,但如果您的对象足够简单,您可以编写一个。覆盖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比某些输入的方法效果更好。

答案 2 :(得分:0)

JSONEncoder班怎么样?

<强>更新

我必须跳过关于类中包含的数据的部分。如果您需要对任意Python对象进行合理的序列化而无需扩展编码器,那么您可以使用picklejson的组合。在酸洗时,使用protocol = 0将数据序列化为人类可读的ASCII。