我是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).
谢谢。
答案 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对象进行合理的序列化而无需扩展编码器,那么您可以使用pickle
和json
的组合。在酸洗时,使用protocol = 0将数据序列化为人类可读的ASCII。