类型错误:ndarray 类型的对象不是 JSON 可序列化的

目录

TypeError: Object of type ndarray is not JSON serializable

  1. 类型错误:ndarray 类型的对象不是 JSON 可序列化的
  2. TypeError:DataFrame 类型的对象不是 JSON 可序列化的

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

当我们尝试将 NumPy ndarray 对象转换为 JSON 字符串时,会出现 Python“TypeError: Object of type ndarray is not JSON serializable”。

要解决该错误,请tolist()在将其序列化为 JSON 之前,使用数组上的方法将其转换为 Python 列表。

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

主程序
import json import numpy as np arr = np.array([1, 2, 3, 4]) # ⛔️ TypeError: Object of type ndarray is not JSON serializable json_str = json.dumps({'nums': arr})

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

将数组转换为Python列表解决错误

要解决该错误,请使用tolist()数组上的方法将其转换为 Python 列表。

主程序
import json import numpy as np arr = np.array([1, 2, 3, 4]) # ✅ used tolist() json_str = json.dumps({'nums': arr.tolist()}) print(json_str) # 👉️ {"nums": [1, 2, 3, 4]} print(type(json_str)) # 👉️ <class 'str'>

在序列化为 JSON 时,我们可以使用本机 Pythonlist而不是 NumPy 。ndarray

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

如果需要将 JSON 字符串转换回 NumPy 数组,请使用该
json.loads()方法。

主程序
import json import numpy as np arr = np.array([1, 2, 3, 4]) # ✅ used tolist() json_str = json.dumps({'nums': arr.tolist()}) my_dict = json.loads(json_str) new_arr = np.array(my_dict['nums']) print(new_arr) # 👉️ [1 2 3 4]

json.loads方法JSON 字符串解析为本机 Python 对象。

我们访问了 Python 列表并使用该np.array方法将其转换为 NumPy 数组。

JSONEncoder类扩展来解决错误

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

主程序
import json import numpy as np class NpEncoder(json.JSONEncoder): def default(self, obj): if isinstance(obj, np.integer): return int(obj) if isinstance(obj, np.floating): return float(obj) if isinstance(obj, np.ndarray): return obj.tolist() return json.JSONEncoder.default(self, obj) arr = np.array([1, 2, 3, 4]) json_str = json.dumps({'nums': arr}, cls=NpEncoder) print(json_str) # 👉️ {"nums": [1, 2, 3, 4]} print(type(json_str)) # 👉️ <class 'str'>

我们从
JSONEncoder
类扩展而来。

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

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

请注意,该类默认JSONEncoder不支持 numpy到 JSON 的转换。ndarray

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

主程序
import json import numpy as np class NpEncoder(json.JSONEncoder): def default(self, obj): if isinstance(obj, np.integer): return int(obj) if isinstance(obj, np.floating): return float(obj) if isinstance(obj, np.ndarray): return obj.tolist() return json.JSONEncoder.default(self, obj)

如果传入的对象是 的实例np.integer,我们将对象转换为 Python int并返回结果。

如果传入的对象是 的实例np.floating,我们将其转换为 Pythonfloat并返回结果。

如果对象是 的实例np.ndarray,我们将其转换为 Pythonlist
并返回结果。

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

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

主程序
import json import numpy as np class NpEncoder(json.JSONEncoder): def default(self, obj): if isinstance(obj, np.integer): return int(obj) if isinstance(obj, np.floating): return float(obj) if isinstance(obj, np.ndarray): return obj.tolist() return json.JSONEncoder.default(self, obj) arr = np.array([1, 2, 3, 4]) # ✅ provide cls keyword argument json_str = json.dumps({'nums': arr}, cls=NpEncoder) print(json_str) # 👉️ {"nums": [1, 2, 3, 4]} print(type(json_str)) # 👉️ <class 'str'>

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

使用default关键字参数解决错误

default您还可以在方法调用中
使用关键字参数
json.dumps()

主程序
import json import numpy as np arr = np.array([1, 2, 3, 4]) def json_serializer(obj): if isinstance(obj, np.ndarray): return obj.tolist() return obj json_str = json.dumps({'nums': arr}, default=json_serializer) print(json_str) # 👉️ {"nums": [1, 2, 3, 4]}

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

关键字default参数可以设置为为无法序列化的对象调用的函数。

我们只需ndarray使用 方法将对象转换为列表tolist()

json_serializer函数将一个对象作为参数并检查该对象是否为ndarray.

如果满足条件,我们使用该tolist()方法将数组转换为列表,否则,按原样返回值。

使用pandas来解决错误

如果使用pandas模块,也可以使用to_json方法解决错误。

主程序
import numpy as np import pandas as pd arr = np.array([1, 2, 3, 4]) json_str = pd.Series(arr).to_json(orient='values') print(json_str) # 👉️ [1,2,3,4]

Series.to_json方法

将对象转换为 JSON 字符串。

orient参数确定预期的 JSON 字符串格式。

values选项用于仅在 JSON 字符串中使用数组的值。

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

DataFrame当我们尝试使用该
方法
将对象序列化为 JSON 时,会出现 Python“TypeError: Object of type DataFrame is not JSON serializable”
json.dumps

要解决该错误,请改用该to_json()方法,例如df.to_json()

这是错误发生方式的示例

主程序
import json import pandas as pd df = pd.DataFrame( { "Name": [ "Alice", "Bob", "Carl", ], "Age": [29, 30, 31], } ) # ⛔️ TypeError: Object of type DataFrame is not JSON serializable print(json.dumps(df))

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

使用to_json()方法解决错误

要解决错误,请使用对象to_json()上的方法DataFrame

主程序
import pandas as pd df = pd.DataFrame( { "Name": [ "Alice", "Bob", "Carl", ], "Age": [29, 30, 31], } ) # 👇️ '{"Name":{"0":"Alice","1":"Bob","2":"Carl"},"Age":{"0":29,"1":30,"2":31}}' print(df.to_json()) # 👇️ <class 'str'> print(type(df.to_json()))

to_json()方法将DataFrame对象转换为 JSON 字符串。

将 the 转换DataFrame为 adict以解决错误

或者,您可以尝试在序列化为 JSON 之前将 转换DataFrame为对象。dict

主程序
import json import pandas as pd df = pd.DataFrame( { "Name": [ "Alice", "Bob", "Carl", ], "Age": [29, 30, 31], } ) # 👇️ '{"Name": {"0": "Alice", "1": "Bob", "2": "Carl"}, "Age": {"0": 29, "1": 30, "2": 31}}' print(json.dumps(df.to_dict())) # 👇️ <class 'str'> print(type(json.dumps(df.to_dict())))

to_dict方法将 转换DataFrame为字典,然后我们可以将其序列化为 JSON。

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

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