TypeError:“float32”类型的对象不是 JSON 可序列化的 [重复]

Posted

技术标签:

【中文标题】TypeError:“float32”类型的对象不是 JSON 可序列化的 [重复]【英文标题】:TypeError: Object of type 'float32' is not JSON serializable [duplicate] 【发布时间】:2019-04-04 13:56:59 【问题描述】:

我正在使用numpy.float32 号码,但它们不会进入JSON。克服这个问题的正确方法是什么?

import numpy as np
import json

a = np.float32(1)
json.dumps(a)

TypeError: Object of type 'float32' is not JSON serializable

【问题讨论】:

接受的答案实际上产生了一个序列化对象的字符串,它实际上是一个json字符串,而不是一个对象。我发现json.dumps(eval(str(a))) 会产生所需的输出 对我来说最简单的是将你的float32转换为float64,然后我将由JSON处理。接受的答案转换会产生一个不太实用的字符串。 【参考方案1】:

它必须是一个字符串,所以你可以有:

json.dumps(str(a))

编辑:

JSON 是一种用于序列化对象数据的格式。它并不真正关心或了解 Python 类型,json 包尝试通过仅支持某些类型的 conversion table 将您传递的任何对象 json.dumps() 转换为字符串形式(请参阅下面的文档)。

这就是为什么我认为最好只传递一个字符串来避免这个问题:numpy.float32 只是不在表格中。

因为有些人评论说将字符串显式传递给dumps“听起来不对”,所以我将在此处添加文档

json.dumps(obj, *, skipkeys=False, ensure_ascii=True, check_circular=真,allow_nan=真,cls=无,缩进=无, separators=None, default=None, sort_keys=False, **kw) 将 obj 序列化为 使用此转换表的 JSON 格式的 str。论据有 与 dump() 中的含义相同。

注意 JSON 的键/值对中的键始终是 str 类型。什么时候 一个字典被转换成 JSON,字典的所有键 被强制转换为字符串。因此,如果字典是 转换成JSON再转回字典,字典 可能不等于原来的。也就是说,loads(dumps(x)) != x 如果 x 有 非字符串键。

取自此处的官方文档:https://docs.python.org/3/library/json.html

【讨论】:

这会将a 的类型更改为字符串。如果要将a 保留为数字,请使用json.dumps(a.item()) 如果您的应用程序中不需要数据为 numpy 浮点格式(大多数应用程序都是这种情况),那么我建议您转换返回 np. float32 在将它们添加到稍后要序列化的字典/列表之前浮动;例如,dict_to_be_jsoned[key0] = float(np.somefunc(...)) 声明“它必须是一个字符串”似乎是错误的,@DomenicoDeFelice 在他的评论中提出了一个更好的解决方案。 json.dumps(a.astype(float)) json.dumps(float(a))

以上是关于TypeError:“float32”类型的对象不是 JSON 可序列化的 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

TypeError:“Mul”Op 的输入“y”的类型为 float32,与参数“x”的类型 int32 不匹配

TypeError:预期的 float32,得到的列表包含类型为“_Message”的张量

TypeError: Input ‘filter‘ of ‘Conv2D‘ Op has type float32 that does not match type float64 of argume

无法在 FLOAT32 类型的 TensorFlowLite 张量和 Java 对象之间转换

TypeError: Message 类型的对象不是 JSON 可序列化的 |不和谐.py

NumPy 类型提示某事物既是数组又是 float32? [复制]