python - 将类实例序列化为 JSON

标签 python json serialization pickle

我正在尝试创建一个类实例的 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/

相关文章:

javascript - 如何删除 html 表的行?

python - Protobuf3 : Serialize a Python object to JSON

jquery - 在 jquery 对话框中加载表单会导致空的 serialize()

python - 当 SQLAlchemy 引发 ProgrammingError 时保留中止的事务

javascript - 如何检查Json中元素的顺序没有改变

python - 形状相交 : parallel planes

jquery - 无法解析来自 jquery Ajax 调用的 JSON 响应

json - 如何将 Swift 4 编码的 JSON 写入文件?

python - 为什么在这个 if/else 中执行 pass 语句?

python - Alembic 检测到更改但使用 --autogenerate 生成空迁移