为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

qq_遁去的一_1 2022-06-28 15:18:13
我收到诸如(事先不知道确切结构)之类的听写{  'a': 1,  'id': UUID('6b3acb30-08bf-400c-bc64-bf70489e388c'),}此 dict 不能直接序列化,但是当将值id转换为str- 时,它是:import jsonimport uuidprint(json.dumps({  'a': 1,  'id': str(uuid.UUID('6b3acb30-08bf-400c-bc64-bf70489e388c')),}))# outputs {"a": 1, "id": "6b3acb30-08bf-400c-bc64-bf70489e388c"}在一般情况下,我有需要在可str序列化之前转换为的元素,是否有一种通用(pythonic)方法可以自动进行转换?
查看完整描述

2 回答

?
元芳怎么了

TA贡献1798条经验 获得超7个赞

最好的选择是覆盖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


查看完整回答
反对 回复 2022-06-28
?
潇潇雨雨

TA贡献1833条经验 获得超4个赞

不,没有,但您可以单独检查数据项并在需要时进行转换。这样你就不需要提前知道数据结构。考虑以下:


import json

import uuid


data = {

  '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"}


查看完整回答
反对 回复 2022-06-28
  • 2 回答
  • 0 关注
  • 120 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号