如何序列化成员不可直接序列化,但其str()表示形式不可直接序列化的对象?

2024-10-01 00:26:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我收到的口述如下(事先不知道确切的结构)

{
  '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)方法来自动进行转换


Tags: importidjson序列化uuidoutputs结构dict
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 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"}

相关问题 更多 >