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 对象之间转换