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

标签 python json encoding

我正在尝试编写一个使用 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() 的特定对象时如何处理自定义类?

如果需要任何说明,请告诉我。

最佳答案

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

关于python - 如何为自定义类实现默认序列化方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12483851/

相关文章:

javascript - 在 Angular JS 脚本中读取 JSON 数据并仅在 JS 中进一步使用该数据

json - JSON 中的奇怪字符导致 UILabel 中出现换行

Mysql2::Error: 不正确的字符串值

python - 将字符串(不带分隔符)转换为 IPV6 地址表示形式

python - 如何在Python中根据键和值合并两个字典?

python - 使用 mailer.py 时出现 "You need version 1.5.0 or better of the Subversion Python bindings"

python - np.all() 没有被执行

java - 判断ByteArrayOutputStream的类型是JSONArray还是JSONObject?

java - 使用 Scanner 读取 utf-8

java - java做一些处理后如何将编码字符串写入数据库