python - 将类实例序列化为 JSON

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

https://stackoverflow.com/questions/10252010/

相关文章:

python - 如何将网页中的 JSON 转换为 Python 脚本

javascript - 将对象字符串转换为 JSON

php - json_encode() 转义正斜杠

python - Python有三元条件运算符吗?

python - 存储 Python 字典

ios - 如何使用 NSJSONSerialization

python - Python 中的元类是什么?

python - 如何在 Python 中检查字符串是否是有效的 JSON?

jquery - TypeError : $. ajax(...) 不是函数?

ios - 如何将 JSON 字符串反序列化为 NSDictionary? (适用于 iOS 5+)