【问题标题】:How do I implement a default serialization method for a custom class?如何为自定义类实现默认序列化方法?
【发布时间】:2012-09-18 19:39:06
【问题描述】:

我正在尝试编写一个使用 json 对象进行通信的程序,但在使用自定义类时遇到了麻烦。基本上,我传递给 json.dumps 的对象是一个大字典,大多只使用基本类(字符串、列表和其他字典),但在某些情况下,我必须将字符串映射到自定义类 A 的对象。

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

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

我想做的是为A类型的对象编写一个默认的编码方法。对象非常简单,只包含一个标签(str类型)和一些不同的整数。标签足以唯一标识A,所以如果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() 如何处理自定义类?

如果需要任何澄清,请告诉我。

【问题讨论】:

    标签: python json encoding


    【解决方案1】:

    您将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"
    ]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-03
      • 1970-01-01
      • 2015-06-19
      • 1970-01-01
      • 1970-01-01
      • 2021-06-12
      • 2018-08-18
      • 1970-01-01
      相关资源
      最近更新 更多