错误场景
在使用json.dumps时,出现问题:
typeerror: object of type int64 is not json serializable
问题分析
- python3中没有int64这个数据类型,所有的整型都是int
- 报错里的int64指的是<class ‘numpy.int64’>,所以很有迷惑性
- 同样的还会出现 typeerror: object of type float32/float64 is not json serializable
解决方案1
typeerror: object of type int64 is not json serializable
def default_dump(obj):
"""convert numpy classes to json serializable objects."""
if isinstance(obj, (np.integer, np.floating, np.bool_)):
return obj.item()
elif isinstance(obj, np.ndarray):
return obj.tolist()
else:
return obj
json.dumps(new_config,ensure_ascii=false, default=default_dump)
解决方案2
import json
class jsonencoder(json.jsonencoder):
"""convert numpy classes to json serializable objects."""
def default(self, obj):
if isinstance(obj, (np.integer, np.floating, np.bool_)):
return obj.item()
elif isinstance(obj, np.ndarray):
return obj.tolist()
else:
return super(jsonencoder, self).default(obj)
json.dumps(new_config,ensure_ascii=false, cls=jsonencoder)
问题延伸:针对flask jsonify() 序列化错误:
flask < 2.2
import datatime
from flask import flask as _flask
from flask.json import jsonencoder as _jsonencoder
class flaskjsonencoder(_jsonencoder):
"""重载flask的json encoder, 确保jsonfy()能解析numpy的json"""
def default(self, obj):
if isinstance(obj, (np.integer, np.floating, np.bool_)):
return obj.item()
elif isinstance(obj, np.ndarray):
return obj.tolist()
elif isinstance(obj, (datetime.datetime, datetime.timedelta)):
return obj.__str__()
else:
return super(flaskjsonencoder, self).default(obj)
class flask(_flask):
"""重载flask的jsonencoder, 确保能解析numpy的json"""
json_encoder = flaskjsonencoder
app = flask(__name__)
flask >= 2.2
import datatime
from flask import flask as _flask
from flask.json.provider import defaultjsonprovider, _default as flaskdefault
class flaskjsonprovider(defaultjsonprovider):
"""重载flask的json encoder, 确保jsonfy()能解析numpy的json"""
@staticmethod
def _default(obj):
if isinstance(obj, (np.integer, np.floating, np.bool_)):
return obj.item()
elif isinstance(obj, np.ndarray):
return obj.tolist()
elif isinstance(obj, (datetime.datetime, datetime.timedelta)):
return obj.__str__()
else:
return flaskdefault(obj)
default = _default
class flask(_flask):
"""重载flask的json_provider_class, 确保能解析numpy的json"""
json_provider_class = flaskjsonprovider
app = flask(__name__)
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论