【问题标题】:TypeError: Object of type 'float32' is not JSON serializable [duplicate]TypeError:“float32”类型的对象不是 JSON 可序列化的 [重复]
【发布时间】: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处理。接受的答案转换会产生一个不太实用的字符串。

标签: python json numpy


【解决方案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))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-11
  • 2019-11-21
  • 2021-11-13
  • 2018-09-22
  • 2019-01-17
  • 2019-12-07
  • 2023-01-20
相关资源
最近更新 更多