
Python中的Set数据类型不是JSON可序列化的。如果你试图将Set转换为json,你会得到这个错误。TypeError。 set类型的对象不是JSON可序列化的。这是因为内置的Python json模块只能处理与JSON直接对应的基元数据类型,而不能处理像Set这样的复杂数据类型。
例如,根本问题是JSON编码器方法,如**json.dump()**和json.dumps()知道如何默认序列化基本数据类型(如字典、列表、字符串、整数、None等)。所以我们来看看如何解决这个错误。
将Python Set转为JSON
要将 Python Set转换为JSON,可以使用jsonpickle.encode() 方法。 jsonpickle是一个第三方模块,可以帮助我们使set变成可序列化的JSON。jsonpickle是一个第三方 Python模块,是为了处理复杂的Python对象而创建的。
你可以使用jsonpickle模块将复杂的对象序列化为JSON,并从JSON反序列化为复杂的Python对象。在我们的例子中,它将一个Python集合转换为json,将json转换为集合。
jsonpickle模块允许更复杂的数据结构被序列化为JSON。此外,jsonpickle模块是高度可配置和可扩展的。
按照下面的步骤,将Set转换为json字符串。
步骤1:安装jsonpickle模块
为了使用jsonpickle模块,你必须首先在系统中安装它。
python3 -m pip install jsonpickle
第2步:导入jsonpickle模块
要在Python中使用jsonpickle模块,请使用导入语句。
import jsonpickle
第3步:定义一个集合并打印其值和数据类型。
要在Python中定义一个集合,使用大括号,并将逗号分隔的值放在大括号内。
import jsonpickle
set_data = {'Vlad Tepes', 'Alucard', 'Trevor', 'Isaac'}
print(set_data)
print(type(set_data))
第4步:使用jsonpickle.encode()方法转换为json格式
jsonpickle.encode()方法是用来将对象转化为JSON字符串的。
json_data = jsonpickle.encode(set_data)
现在,打印json_data的值和它的数据类型。
import jsonpickle
set_data = {'Vlad Tepes', 'Alucard', 'Trevor', 'Isaac'}
print(set_data)
print(type(set_data))
print("----------After converting set to json-----------")
json_data = jsonpickle.encode(set_data)
print(json_data)
print(type(json_data))
输出
{'Isaac', 'Vlad Tepes', 'Trevor', 'Alucard'}
<class 'set'>
----------After converting set to json-----------
{"py/set": ["Isaac", "Vlad Tepes", "Trevor", "Alucard"]}
<class 'str'>
你可以看到,在使用**jsonpickle.encode()**方法后,我们得到了json字符串。
使用jsonpickle.decode()方法将JSON转换成Set
为了从JSON字符串重新创建Python集合,使用jsonpickle.decode()方法。
import jsonpickle
set_data = {'Vlad Tepes', 'Alucard', 'Trevor', 'Isaac'}
print(set_data)
print(type(set_data))
print("----------After converting set to json-----------")
json_data = jsonpickle.encode(set_data)
print(json_data)
print(type(json_data))
print("----------After converting json to set-----------")
decoded_set = jsonpickle.decode(json_data)
print(decoded_set)
print(type(decoded_set))
输出
{'Vlad Tepes', 'Trevor', 'Isaac', 'Alucard'}
<class 'set'>
----------After converting set to json-----------
{"py/set": ["Vlad Tepes", "Trevor", "Isaac", "Alucard"]}
<class 'str'>
----------After converting json to set-----------
{'Vlad Tepes', 'Trevor', 'Isaac', 'Alucard'}
<class 'set'>
我们得到了我们的原始Python对象,一个Set,并且我们已经通过检查它的数据类型验证了这一点。
还有一种方法可以使Set可序列化,但是我们需要使用json和JSONEncoder库从头开始建立一个编码器。
使用自定义的JSONEncoder
为了将Set转换为JSON字符串,编写一个自定义编码器,将Python Set序列化为JSON。Python json模块提供了一个JSONEncoder来将Python对象编码为JSON。我们可以通过实现它的**default()**方法来扩展,以转换JSON可序列化的集合。
JSONEncoder类有一个**default()**方法,它将被用来执行JSONEncoder.encode()方法。这个方法只将基本类型转换为JSON。
按照下面的步骤创建一个自定义的JSONEncoder,并将Set转化为json字符串。
第1步:导入所需模块
我们将使用json模块的两个方法。所以在文件的开头导入两个方法。
from json import dumps
from json import JSONEncoder
第2步:定义一个自定义的JSONEncoder
让我们定义set_encoder这个类。
class set_encoder(JSONEncoder):
def default(self, obj):
return list(obj)
使用这个类,现在我们可以使用encode()方法将Set转换成一个json字符串。
第三步:定义一个样本集并使用encode()方法。
让我们定义一个样本集,然后我们将其转换。
set_data = {'Vlad Tepes', 'Alucard', 'Trevor', 'Isaac'}
现在,我们将使用set_encoder().encode()方法,并将set_data作为一个参数传递,返回json字符串。所以我们的完整代码看起来像这样。
from json import dumps
from json import JSONEncoder
class set_encoder(JSONEncoder):
def default(self, obj):
return list(obj)
set_data = {'Vlad Tepes', 'Alucard', 'Trevor', 'Isaac'}
print(set_data)
print("----------After converting set to json-----------")
json_data = set_encoder().encode(set_data)
print(json_data)
print(type(json_data))
输出
{'Trevor', 'Alucard', 'Vlad Tepes', 'Isaac'}
----------After converting set to json-----------
["Trevor", "Alucard", "Vlad Tepes", "Isaac"]
<class 'str'>
这就是了。我们已经成功构建了一个编码器,可以将任何对象转换为json字符串。
另一种方法是使用一个自定义的json编码器与dumps()方法。让我们看看如何做到这一点。
**json.dumps()**方法可以接受一个自定义编码器作为参数,并返回编码后的字符串。
from json import dumps
from json import JSONEncoder
class set_encoder(JSONEncoder):
def default(self, obj):
return list(obj)
set_data = {'Vlad Tepes', 'Alucard', 'Trevor', 'Isaac'}
print(set_data)
print("----------Using dumps() method to convert set to json-----------")
json_data = dumps(set_data, indent=4, cls=set_encoder)
print(json_data)
print(type(json_data))
输出
{'Vlad Tepes', 'Isaac', 'Alucard', 'Trevor'}
----------Using dumps() method to convert set to json-----------
[
"Vlad Tepes",
"Isaac",
"Alucard",
"Trevor"
]
<class 'str'>
我们得到同样的结果,当然还有缩进。
使用自定义解码器将JSON字符串转换为集合
为了将 json 字符串 转换为Python 集合,使用 **json.load()和set()**方法的组合。
from json import dumps, JSONEncoder, loads
class set_encoder(JSONEncoder):
def default(self, obj):
return list(obj)
set_data = {'Vlad Tepes', 'Alucard', 'Trevor', 'Isaac'}
print(set_data)
print("----------Using dumps() method to convert set to json-----------")
json_data = dumps(set_data, indent=4, cls=set_encoder)
print(json_data)
print(type(json_data))
print("----------Using set(loads()) method to convert json to set-----------")
set_obj = set(loads(json_data))
print(set_obj)
print(type(set_obj))
输出
{'Trevor', 'Vlad Tepes', 'Alucard', 'Isaac'}
----------Using dumps() method to convert set to json-----------
[
"Trevor",
"Vlad Tepes",
"Alucard",
"Isaac"
]
<class 'str'>
----------Using set(loads()) method to convert json to set-----------
['Trevor', 'Vlad Tepes', 'Alucard', 'Isaac']
<class 'set'>
输出
{'Alucard', 'Vlad Tepes', 'Trevor', 'Isaac'}
----------Using dumps() method to convert set to json-----------
[
"Alucard",
"Vlad Tepes",
"Trevor",
"Isaac"
]
<class 'str'>
----------Using set(loads()) method to convert json to set-----------
{'Alucard', 'Vlad Tepes', 'Trevor', 'Isaac'}
<class 'set'>
loads()方法返回列表,我们可以使用set()方法将列表转换为集合。
本教程就到此为止。