Python中简单的JSON编码

5 投票
3 回答
6186 浏览
提问于 2025-04-16 03:55

我刚开始学习Python(我用的是Python 3),我想把一个包含一个字符串和两个列表的类转换成JSON格式。 我发现Python标准库里有一个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).

谢谢。

3 个回答

0

JSONEncoder 这个类怎么样呢?

更新

我可能跳过了关于数据被包含在一个类中的部分。如果你想要把任意的Python对象转换成可以理解的格式,而不需要扩展编码器的话,或许可以试试把 picklejson 结合起来使用。在使用pickle的时候,设置协议为0,这样可以把数据转换成易于阅读的ASCII格式。

3

你觉得 json 库怎么会知道怎么把任意类转换成可以存储的格式呢?

在你的情况下,如果你的类比较简单,你可以试试下面这种方法

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

这样就可以把对象的成员进行转换了。

而反向转换(也就是把存储的格式再变回对象)可能需要用到类似这样的代码

foo_data = json.loads(json_string)
foo = FooObject(**foo_data)
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比使用is method效果更好。

撰写回答