TypeError:类型集的对象不是 JSON 可序列化的

TypeError:类型集的对象不是 JSON 可序列化的

TypeError: Object of type set is not JSON serializable

当我们尝试将set对象转换为 JSON 字符串时,会出现 Python“TypeError: Object of type set is not JSON serializable”。要解决该错误,请在将其set序列化为 JSON 之前将其转换为列表,例如
json.dumps(list(my_set)).

下面是错误如何发生的示例。

主程序
import json my_set = {'a', 'b', 'c', 'd'} # ⛔️ TypeError: Object of type set is not JSON serializable json_str = json.dumps(my_set)

我们尝试将set对象传递给该方法,但默认情况下json.dumps()该方法不处理对象set

要解决该错误,请在序列化之前使用内置list()类将 he 转换set为 a
list

主程序
import json my_set = {'a', 'b', 'c', 'd'} json_str = json.dumps(list(my_set)) print(json_str) # '["b", "c", "a", "d"]' print(type(json_str)) # <class 'str'>

默认的 JSON 编码器处理list值,因此我们可以
在序列化为 JSON 时使用本机 Python
list而不是Python。set

json.dumps方法将 Python 对象转换为 JSON 格式的字符串

或者,您可以从JSONEncoder类扩展并在方法中处理转换default

主程序
import json class SetEncoder(json.JSONEncoder): def default(self, obj): if isinstance(obj, set): return list(obj) return json.JSONEncoder.default(self, obj) my_set = {'a', 'b', 'c', 'd'} json_str = json.dumps(my_set, cls=SetEncoder) print(json_str) # 👉️ '["b", "c", "a", "d"]' print(type(json_str)) # 👉️ <class 'str'>

我们从
JSONEncoder
类扩展而来。

该类JSONEncoder默认支持以下对象和类型。

Python JSON
字典 目的
列表,元组 大批
海峡 细绳
int、float、int 和 float 派生枚举 数字
真的 真的
错误的 错误的
没有任何 无效的

请注意,JSONEncoder该类默认不支持setJSON 转换。

我们可以通过从类扩展并实现一个default()
返回可序列化对象的方法来处理这个问题。

主程序
import json class SetEncoder(json.JSONEncoder): def default(self, obj): if isinstance(obj, set): return list(obj) return json.JSONEncoder.default(self, obj)

如果传入的值是 a set,我们将其转换为 alist并返回结果。

如果传入的对象是传入类的实例或子类,则isinstance
函数返回。
True

在所有其他情况下,我们让基类的默认方法进行序列化。

要使用自定义,请在调用该方法时使用关键字参数JSONEncoder指定它。clsjson.dumps()

主程序
import json class SetEncoder(json.JSONEncoder): def default(self, obj): if isinstance(obj, set): return list(obj) return json.JSONEncoder.default(self, obj) my_set = {'a', 'b', 'c', 'd'} # ✅ pass cls keyword argument json_str = json.dumps(my_set, cls=SetEncoder) print(json_str) # 👉️ '["b", "c", "a", "d"]' print(type(json_str)) # 👉️ <class 'str'>

如果您不提供clskwarg,JSONEncoder则使用默认值。

结论#

当我们尝试将set对象转换为 JSON 字符串时,会出现 Python“TypeError: Object of type set is not JSON serializable”。要解决该错误,请在将其set序列化为 JSON 之前将其转换为列表,例如
json.dumps(list(my_set)).