我正在尝试创建一个类实例的 JSON 字符串表示,但遇到了困难。假设这个类是这样构建的:
class testclass:
value1 = "a"
value2 = "b"
对 json.dumps 的调用是这样的:
t = testclass()
json.dumps(t)
失败并告诉我测试类不是 JSON 可序列化的。
TypeError: <__main__.testclass object at 0x000000000227A400> is not JSON serializable
我也尝试过使用 pickle 模块:
t = testclass()
print(pickle.dumps(t, pickle.HIGHEST_PROTOCOL))
它给出了类实例信息,而不是类实例的序列化内容。
b'\x80\x03c__main__\ntestclass\nq\x00)\x81q\x01}q\x02b.'
我做错了什么?
最佳答案
基本问题是 JSON 编码器 json.dumps()
默认只知道如何序列化有限的一组对象类型,所有内置类型。在此处列出:https://docs.python.org/3.3/library/json.html#encoders-and-decoders
一个好的解决方案是让您的类继承自 JSONEncoder
,然后实现 JSONEncoder.default()
函数,并让该函数为您发出正确的 JSON类。
一个简单的解决方案是在该实例的 .__dict__
成员上调用 json.dumps()
。这是一个标准的 Python dict
,如果你的类很简单,它将是 JSON 可序列化的。
class Foo(object):
def __init__(self):
self.x = 1
self.y = 2
foo = Foo()
s = json.dumps(foo) # raises TypeError with "is not JSON serializable"
s = json.dumps(foo.__dict__) # s set to: {"x":1, "y":2}
这篇博文讨论了上述方法:
Serializing arbitrary Python objects to JSON using _dict_
当然,Python 提供了一个内置函数来为您访问 .__dict__
,称为 vars()
。
所以上面的例子也可以这样写:
s = json.dumps(vars(foo)) # s set to: {"x":1, "y":2}
关于python - 将类实例序列化为 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10252010/