如何序列化成员不能直接序列化的对象,但它们的 str() 表示是?

我收到诸如(事先不知道确切结构)之类的听写


{

  'a': 1,

  'id': UUID('6b3acb30-08bf-400c-bc64-bf70489e388c'),

}

此 dict 不能直接序列化,但是当将值id转换为str- 时,它是:


import json

import uuid


print(json.dumps({

  'a': 1,

  'id': str(uuid.UUID('6b3acb30-08bf-400c-bc64-bf70489e388c')),

}))


# outputs {"a": 1, "id": "6b3acb30-08bf-400c-bc64-bf70489e388c"}

在一般情况下,我有需要在可str序列化之前转换为的元素,是否有一种通用(pythonic)方法可以自动进行转换?


qq_遁去的一_1
浏览 121回答 2
2回答

元芳怎么了

最好的选择是覆盖JSONEncoder.default方法:class MyJSONEncoder(json.JSONEncoder):    def default(self, o):        if isinstance(o, uuid.UUID):            return str(o)        return super().default(o)print( MyJSONEncoder().encode(data) )如果您想对默认编码器无法处理的所有内容进行字符串化,您可以使用以下技巧,尽管我建议您控制您想要支持的类型。class MyJSONEncoder(json.JSONEncoder):    def default(self, o):        try:            return super().default(o)        except TypeError:            return str(o)print( json.dumps(data, cls=MyJSONEncoder) )文档: https ://docs.python.org/3/library/json.html#json.JSONEncoder.default

潇潇雨雨

不,没有,但您可以单独检查数据项并在需要时进行转换。这样你就不需要提前知道数据结构。考虑以下:import jsonimport uuiddata = {  'a': 1,  'id': UUID('6b3acb30-08bf-400c-bc64-bf70489e388c')}for k, v in data.items():    try:        json.dumps(v)    except TypeError:        data[k] = str(uuid.v)print(json.dumps(data))# outputs {"a": 1, "id": "6b3acb30-08bf-400c-bc64-bf70489e388c"}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java