Python 如何序列化成员不可直接序列化,但其str()表示形式不可直接序列化的对象?
我收到的口述如下(事先不知道确切的结构) 此dict不可直接序列化,但将Python 如何序列化成员不可直接序列化,但其str()表示形式不可直接序列化的对象?,python,json,python-3.x,serialization,casting,Python,Json,Python 3.x,Serialization,Casting,我收到的口述如下(事先不知道确切的结构) 此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"} 在一般情况下,
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)方法来自动进行转换?没有,但是您可以单独检查数据项,并在需要时进行转换。这样,您就不需要事先知道数据结构。考虑以下事项:
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"}
最好的选择是覆盖
jsonecoder。默认方法:
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) )
文档:比我快,+1!另外,json.dump(data,cls=myjsonecoder)
将是本例中的dump
用法。
class MyJSONEncoder(json.JSONEncoder):
def default(self, o):
try:
return super().default(o)
except TypeError:
return str(o)
print( json.dumps(data, cls=MyJSONEncoder) )