如何实现自定义类的默认序列化方法?

2024-09-29 23:26:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试图编写一个程序,使用json对象进行通信,但遇到了自定义类的问题。基本上就是我进入的物体json.dumps文件是一个很大的字典,大部分只使用基本类(字符串、列表和其他字典),但在某些情况下,我必须将字符串映射到自定义类a的对象

当我使用这些对象时,会得到如下信息:

TypeError: <module.A object at 0x01659110> is not JSON serializable

我想做的是为类型a的对象编写一个默认的编码方法。这些对象非常简单,只包含一个标签(str类型)和一些不同的整数。标签足以唯一地标识一个对象,因此如果json单独使用标签,就可以了。你知道吗

在网上阅读了许多类似的问题后,我最终得到了:

class AEncoder(json.JSONEncoder):
    def default(self, o):
        if isinstance(o, A):
            return o.label
        else:
            return super(AEncoder, self).default(o)

问题是,我从所有人那里得到的信息包括:

AEncoder().encode(object) 

在将对象传递到json.dumps文件(),但我事先没有访问该对象的权限。它藏在前面提到的那本大字典里,有时我找不到。我也尝试过实现A的__repr__函数,但得到了相同的错误。你知道吗

所以。。。尝试摘要版本:当我无法访问传递到json.dumps()的特定对象时,如何告诉json.dumps()如何处理自定义类?你知道吗

如果需要澄清,请告诉我。你知道吗


Tags: 文件对象字符串self信息jsondefault类型
1条回答
网友
1楼 · 发布于 2024-09-29 23:26:02

cls参数传递给dump函数:

json.dumps(obj, cls=AEncoder)

下面是一个用法示例:

>>> class Something(object):
...    def __init__(self, v):
...       self.v = v
... 
>>> import json
>>> class SEncoder(json.JSONEncoder):
...    def default(self, obj):
...       if isinstance(obj, Something):
...          return {'classtype': 'Something', 'v': obj.v}
...       return json.JSONEncoder.default(self, obj)
... 
>>> s1 = Something(3)
>>> s2 = Something(4)
>>> o = [s1, s2, 6, "hello"]
>>> print json.dumps(o, cls=SEncoder, indent=2)
[
  {
    "classtype": "Something", 
    "v": 3
  }, 
  {
    "classtype": "Something", 
    "v": 4
  }, 
  6, 
  "hello"
]

相关问题 更多 >

    热门问题