亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何序列化成員不能直接序列化的對象,但它們的 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 關注
  • 139 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號