json.dumps()是将python对象进行json格式的编码(转换成json字符串),很多类型的数据无法转换,所以就简单粗暴地在编码前全部转换成str类型就好了。其他类型错误照葫芦画瓢就行了。
编写类来进行格式转换
import json
import datetime
import numpy as np
class MyEncoder(json.JSONEncoder):
def default(self, obj):
#检查到是bytes类型的数据就转为str类型
if isinstance(obj, bytes):
return str(obj, encoding='utf-8')
#检查到是intc类型的数据就转为str类型
if isinstance(obj, np.intc):
return str(obj)
#检查到是float32类型的数据就转为str类型
if isinstance(obj, np.float32):
return str(obj)
#检查到是datetime.datetime类型的数据就转为str类型
if isinstance(obj, datetime.datetime):
return obj.strftime("%Y-%m-%d %H:%M:%S")
return json.JSONEncoder.default(self, obj)
原代码部分:
out = {
"log_id": "id",
"image_name": pic_str,
"image_data": 'photo time',
"results": [
{
"name": "seepage water",
"data_time": datetime.datetime.now(), #datetime
"score": list(scores), #float32
"location": {
"boxes": boxes, #intc
"mask": masks #intc
}
}
]
}
with open('out.json', 'w', encoding="utf-8") as f:
json.dump(out, f, cls=MyEncoder, ensure_ascii=False, indent=2) #此处有变化噢
也可以直接在原代码上进行修改:
out = {
"log_id": "id",
"image_name": pic_str,
"image_data": 'photo time',
"results": [
{
"name": "seepage water",
"data_time": str(datetime.datetime.now()), #datetime
"score": str(list(scores)), #float32
"location": {
"boxes": str(boxes), #intc
"mask": str(masks) #intc
}
}
]
}
with open('out.json', 'w', encoding="utf-8") as f:
json.dump(out, f, ensure_ascii=False, indent=2)