TypeError:“ float32”类型的对象不可JSON序列化

Fra*_*olo 13 python json numpy

我正在处理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
Run Code Online (Sandbox Code Playgroud)

ven*_*lac 14

它必须是一个字符串,因此您可以拥有:

json.dumps(str(a))
Run Code Online (Sandbox Code Playgroud)

编辑:

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

这就是为什么我认为只传递一个字符串来避免此问题的一个好主意的原因:numpy.float32只是不在表中。

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

json.dumps(obj,*,skipkeys = False,确保使用此转换表转换为JSON格式的str。这些参数与dump()中的含义相同。

注意JSON的键/值对中的键始终为str类型。当字典转换为JSON时,字典的所有键都被强制转换为字符串。结果,如果将字典转换为JSON,然后又转换回字典,则该字典可能不等于原始字典。也就是说,如果x具有非字符串键,那么load(dumps(x))!= x。

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

  • 这会将`a`的类型更改为字符串。如果您想将`a`保留为数字,请使用`json.dumps(a.item())`。 (9认同)
  • `json.dumps(a.astype(float))` (7认同)
  • 如果您不需要应用程序中的数据为numpy float格式(大多数应用程序都是这种情况),那么建议您将返回np.float32的numpy ops的结果转换为float,然后再将其添加到您的应用程序中以后要序列化的字典/列表;例如,`dict_to_be_jsoned [key0] = float(np.somefunc(...))` (3认同)
  • 声明者“它必须是一个字符串”似乎是错误的,@DomenicoDeFelice 在他的评论中提出了更好的解决方案。 (3认同)
  • 或 `json.dumps(float(a))` (3认同)
  • 这个答案是错误的。只有 dict 键必须是 JSON 中的字符串;值可以是整数或浮点数、列表、字典等。因此,无需将数字转换为字符串以将其保存为 JSON。 (3认同)
  • @Jonathon @mac13k 在这种情况下,“a”是一个简单的数字,但一般来说它可能是一个更复杂的 json 兼容数据结构,比如整个字典。所以简单的转换并不是最可扩展的方法 (2认同)