支持嵌套类型中自定义类的默认序列化

尼斯巴

我定义了一个类,A并且使用了A其他类、容器和嵌套类型内部的对象

例子

a = A()
b = [a,3,'hello'
c = {'hey': b, 'huy': 3}
d = [a,b,c]

我对 的 json 表示感兴趣d,所以当然我必须指定遇到A.

对于 'A' 类的对象,我想得到这个(请注意,我正在跳过 att2,这表明我不知道使用类似的东西a.__dict__):

{
    class_name = 'A',
    att1 = '<value of att1>',
    att3 = '<value of att3>'
}

att1 可以是任何东西:A实例、默认类型等。

我希望能够调用json.dumps(d)并获得所需的输出,所以我想做的是告诉类A在 json 序列化程序询问时输出什么。

我环顾四周,我只找到了一个复杂的解决方案,其中传递了一个 lambda 或一个类json.dumps(),我不明白为什么不只是覆盖 json 序列化程序调用的方法,比如覆盖__str__()__repr__().

也许这是不可能的?在这种情况下,在我的情况下什么是简单的解决方案?请注意,在我的实际问题中,我不仅有类,A还有嵌套在一起的各种自定义类,因此覆盖默认序列化程序将是自然而简单的解决方案。

我的尝试之一

我正在尝试遵循encoder.py第160行的建议

所以A子类化json.JSONEncoder,我声明了方法

def default(self,obj):
    return 'valid custom json representation of A'

但这不起作用,并且引发了上述链接第 179 行的异常。我的代码有什么问题?

supersam654

默认的 JSON 编码器(您链接到的)只知道如何处理“简单”的东西,比如字典、列表、字符串和数字。它不尝试序列化类,因此没有可以在类上实现的“特殊”方法以使其可 JSON 序列化。基本上,如果你想使用json.dumps,你将不得不传递一些额外的东西以使其与你的自定义类一起工作。

当编码器不知道如何处理对象时,它会调用该default方法。根据您的问题,我相信您已经发现了这一点,但是您对该default方法应该去哪里感到有些困惑这是一个可以满足您要求的示例:

import json

def default(o):
    if hasattr(o, 'to_json'):
        return o.to_json()
    raise TypeError(f'Object of type {o.__class__.__name__} is not JSON serializable')

class A(object):
    def __init__(self):
        self.data = 'stuff'
        self.other_data = 'other stuff'

    def to_json(self):
        return {'data': self.data}

a = A()
b = [a, 3, 'hello']
c = {'hey': b, 'huy': 3}
d = [a, b, c]

print(json.dumps(d, default=default))

打印出来:

[{"data": "stuff"}, [{"data": "stuff"}, 3, "hello"], {"hey": [{"data": "stuff"}, 3, "hello"], "huy": 3}]

请注意,每个自定义类to_json现在只需要实现该方法,一切都会正确序列化(假设您default在调用 时传入自定义函数json.dumps)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用YamlDotNEt和C#中的自定义类型类反序列化嵌套的YAML

为 Python 中的自定义类型添加序列化和反序列化支持

是否可以在自定义序列化程序中序列化为已知的默认格式?

JSON.Net - 如何反序列化自定义类型的嵌套字段

gson嵌套的自定义序列化程序

序列化器:自定义嵌套关系

如何在自定义序列化程序中访问默认的杰克逊序列化

枚举类型的自定义Serde序列化

使用 GSON 序列化自定义类

List 类的自定义 KotlinX 序列化程序

反序列化:从自定义类获取数据

类的自定义序列化失败

自定义gson序列化抽象类

自定义类的对象列表的json序列化

EF Core中具有自动序列化/反序列化功能的自定义类型

默认序列化和自定义序列化有什么区别?

嵌套序列化程序中的Django Rest Framework自定义URL

使用Jackson在Java中嵌套自定义反序列化

在自定义JsonConverter中反序列化嵌套对象列表

序列化中的嵌套字段在Django REST框架中使用自定义字段

如何自定义嵌套序列化程序中的字段?

自定义层不支持序列化自定义激活功能

如何在Jackson JSON(反序列化)中自定义序列化或转换具有自定义键类型的Map属性?

在C#中序列化实现IEnumerable的自定义泛型类型

在自定义Java AWS应用程序中找不到类的序列化程序

使用特定语法序列化ActiveRecord中的自定义类

从包中存储和检索自定义可序列化类的 ArrayList

NSMutableArray的自定义类对象的序列化和反序列化

在春季,默认情况下是否可以对类型使用自定义序列化器/反序列化器?