【问题标题】:How I can serialize the json in Python?如何在 Python 中序列化 json?
【发布时间】:2020-07-05 19:54:10
【问题描述】:

这是代码,错误如下:

import numpy as np
import json
X=np.arange(20)
t=dict(x=list(X))
print(json.dumps(t))

错误是:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python35\lib\json\__init__.py", line 230, in dumps
    return _default_encoder.encode(obj)
  File "C:\Python35\lib\json\encoder.py", line 199, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "C:\Python35\lib\json\encoder.py", line 257, in iterencode
    return _iterencode(o, 0)
  File "C:\Python35\lib\json\encoder.py", line 180, in default
    raise TypeError(repr(o) + " is not JSON serializable")
TypeError: 0 is not JSON serializable

请让我知道我可以做些什么来摆脱这种情况。我正在尝试将此值传递给绘图窗口,但同样的错误正在发生。

【问题讨论】:

标签: python json python-3.x numpy serialization


【解决方案1】:

一种方法在数组上映射int

例如:

import numpy as np
import json
X=np.arange(20)
t=dict(x=list(map(int, X)))
print(json.dumps(t))

【讨论】:

    【解决方案2】:

    我认为这是因为 json 无法识别 numpy 数据类型。

    我试过这段代码,它成功了。

    import json
    t= {'x': [i for i in range(20)]}
    print(json.dumps(t))
    

    【讨论】:

      【解决方案3】:

      我猜您的 json 值类型转换不正确。试图找到与您的查询相关的内容:TypeError: Object of type 'int64' is not JSON serializable

      你只需要输入转换它:

      >>> t = dict(x=list(float(j) for j in X))
      >>> json.dumps(t)
      '{"x": [0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 17.0, 18.0, 19.0]}'
      

      我想这会奏效。

      【讨论】:

      • X.tolist() 更快更容易。
      【解决方案4】:

      另一种方法是使用tolist 方法。这会将数组数据的副本作为(嵌套的)Python 列表返回。对于一维数组,a.tolist()list(a) 几乎相同。但是,对于二维数组,tolist 递归应用:

      >>> import numpy as np
      >>> import json
      
      >>> X = np.arange(20)
      >>> t = dict(x=X.tolist())
      >>> print(json.dumps(t))
      {"x": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]}
      

      【讨论】:

      • list() 返回包裹在 numpy 类型中的数字。这造成了 json 问题。 tolist 将它们一路解包。
      猜你喜欢
      • 2012-06-25
      • 2010-10-22
      • 2015-10-08
      • 1970-01-01
      • 2013-03-01
      • 2019-07-23
      • 2016-08-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多