目录
TypeError: Object of type ndarray is not JSON serializable
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
使用关键字参数指定它。cls
json.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 派生枚举 | 数字 |
真的 | 真的 |
错误的 | 错误的 |
没有任何 | 无效的 |