use*_*894 145 python encoding json typeerror
我试图从python发送一个简单的字典到json文件,但我一直得到"TypeError:1425不是JSON可序列化"的消息.
import json
alerts = {'upper':[1425],'lower':[576],'level':[2],'datetime':['2012-08-08 15:30']}
afile = open('test.json','w')
afile.write(json.dumps(alerts,encoding='UTF-8'))
afile.close()
Run Code Online (Sandbox Code Playgroud)
如果我添加默认参数,那么它会写入,但整数值将作为字符串写入json文件,这是不可取的.
afile.write(json.dumps(alerts,encoding='UTF-8',default=str))
Run Code Online (Sandbox Code Playgroud)
use*_*894 250
我发现了我的问题.问题是我的整数实际上是类型numpy.int64.
hsc*_*hsc 35
似乎在Python 3中将numpy.int64转储到json字符串中可能存在问题,并且python团队已经就此进行了对话.更多细节可以在这里找到.
Serhiy Storchaka提供了一种解决方法.它工作得很好所以我把它贴在这里:
def convert(o):
if isinstance(o, numpy.int64): return int(o)
raise TypeError
json.dumps({'value': numpy.int64(42)}, default=convert)
Run Code Online (Sandbox Code Playgroud)
use*_*236 12
正如@JAC 在评分最高的答案的评论中指出的那样,通用解决方案(适用于所有 numpy 类型)可以在将 numpy dtypes 转换为原生 python 类型线程中找到 。
尽管如此,我将在下面添加我的解决方案版本,因为在我的情况下,我需要一个通用解决方案,将这些答案与另一个线程的答案结合起来。这应该适用于几乎所有 numpy 类型。
def convert(o):
if isinstance(o, np.generic): return o.item()
raise TypeError
json.dumps({'value': numpy.int64(42)}, default=convert)
Run Code Online (Sandbox Code Playgroud)
int64(from numpy)转换为int.例如,如果变量x是 int64:
int(x)
Run Code Online (Sandbox Code Playgroud)
如果是 int64 数组:
map(int, x)
Run Code Online (Sandbox Code Playgroud)
这可能是迟到的回应,但最近我遇到了同样的错误。经过大量冲浪后,这个解决方案帮助了我。
alerts = {'upper':[1425],'lower':[576],'level':[2],'datetime':['2012-08-08 15:30']}
def myconverter(obj):
if isinstance(obj, np.integer):
return int(obj)
elif isinstance(obj, np.floating):
return float(obj)
elif isinstance(obj, np.ndarray):
return obj.tolist()
elif isinstance(obj, datetime.datetime):
return obj.__str__()
Run Code Online (Sandbox Code Playgroud)
通话myconverter中json.dumps()像下面。json.dumps(alerts, default=myconverter).
| 归档时间: |
|
| 查看次数: |
89618 次 |
| 最近记录: |