2 回答

TA貢獻(xiàn)1798條經(jīng)驗 獲得超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) )
如果您想對默認(rèn)編碼器無法處理的所有內(nèi)容進(jìn)行字符串化,您可以使用以下技巧,盡管我建議您控制您想要支持的類型。
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

TA貢獻(xiàn)1833條經(jīng)驗 獲得超4個贊
不,沒有,但您可以單獨檢查數(shù)據(jù)項并在需要時進(jìn)行轉(zhuǎn)換。這樣你就不需要提前知道數(shù)據(jù)結(jié)構(gòu)??紤]以下:
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"}
添加回答
舉報