TypeError:“int32”类型的对象不是 JSON 可序列化的
Posted
技术标签:
【中文标题】TypeError:“int32”类型的对象不是 JSON 可序列化的【英文标题】:TypeError: Object of type 'int32' is not JSON serializable 【发布时间】:2018-09-22 13:06:25 【问题描述】:我必须选择那些在字典中已经发布的症状。它工作正常。但是对于某些症状 typeError 显示在命令提示符中,并且所有都打印在命令提示符中但不在 html 页面中。 这是我的代码
views.py
def predict(request):
sym=request.POST.getlist('symptoms[]')
sym=list(map(int,sym))
diseaseArray=[]
diseaseArray=np.array(diseaseArray,dtype=int)
dictArray=[]
for dicti in dictionary:
if (set(sym)<= set(dicti['symptoms']) and len(sym)!= 0) or [x for x in sym if x in dicti['primary']]:
diseaseArray=np.append(diseaseArray,dicti['primary'])
diseaseArray=np.append(diseaseArray,dicti['symptoms'])
diseaseArray=list(set(diseaseArray))
print(diseaseArray)
for i in diseaseArray:
if i not in sym:
dict='id':i
dictArray.append(dict)
print(dictArray)
for j in dictArray:
symptoms=Symptom.objects.get(syd=j['id'])
j['name']=symptoms.symptoms
print(j['name'])
print(len(dictArray))
return JsonResponse(dictArray,safe=False)
模板
$('.js-example-basic-multiple').change(function()
$('#suggestion-list').html('');
$('#suggestion').removeClass('invisible');
$.ajax(
url:"/predict",
method:"post",
data:
symptoms: $('.js-example-basic-multiple').val(),
,
success: function(data)
data.forEach(function(disease)
console.log(disease.name)
$('#suggestion-list').append('<li>'+disease.name+'<li>')
$('#suggestion-list').removeClass('invisible');
);
);
【问题讨论】:
【参考方案1】:您似乎正在尝试保存非 JSON 可序列化对象。 如果您想保存特定对象以供以后使用,我建议您使用 pickle。 https://docs.python.org/3/library/pickle.html
【讨论】:
你能解释一下吗?哪个必须用pickle保存?字典是用pickle保存的。 您尝试保存到 JSON 中的某些数据类型不是默认的 python 内置数据类型。像 int32 ,如果你想以任何格式保存你的对象,以便你下次可以阅读它。您可以使用 pickle.dump 代替 json.dump【参考方案2】:diseaseArray
中每个元素的类型是 np.int32
,由以下行定义:
diseaseArray=np.array(diseaseArray,dtype=int) # Elements are int32
int32
无法通过从视图返回的 JsonResponse
序列化为 JSON。
要修复,请将 id 值转换为常规的int
:
def predict(request):
...
for i in diseaseArray:
if i not in sym:
dict='id': int(i) # Convert the id to a regular int
dictArray.append(dict)
print(dictArray)
...
【讨论】:
我修复了我的代码。但我删除了那个 dtype 并且工作正常【参考方案3】:您通常可以让 numpy 为您执行此操作,而不是像公认的答案建议的那样手动将值转换为整数。
而不是调用
diseaseArray=list(set(diseaseArray))
你可以打电话
diseaseArray=diseaseArray.unique().tolist()
这应该将数组中的automatically convert any numpy-specific datatypes 转换为普通的 Python 数据类型。在这种情况下,它将 int32 转换为 int,但它也支持其他转换。
此外,使用 numpys .unique()
可能会为大型数据集提供一些加速。
【讨论】:
以上是关于TypeError:“int32”类型的对象不是 JSON 可序列化的的主要内容,如果未能解决你的问题,请参考以下文章
Tensorflow Slim:TypeError:预期 int32,得到的列表包含类型为“_Message”的张量
Python 错误:TypeError:'Timestamp' 类型的对象不是 JSON 可序列化的'
Celery EncodeError(TypeError('响应类型的对象不是 JSON 可序列化的'))