Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何序列化成员不可直接序列化,但其str()表示形式不可直接序列化的对象?_Python_Json_Python 3.x_Serialization_Casting - Fatal编程技术网

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

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"} 在一般情况下,

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

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

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

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) )