如何将Python集合转换为JSON

1,451 阅读5分钟

How to Convert Python Set to JSON Data type

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()方法将列表转换为集合

本教程就到此为止。