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”的张量

“TypeError”类型的对象不是 JSON 可序列化的

Python 错误:TypeError:'Timestamp' 类型的对象不是 JSON 可序列化的'

Celery EncodeError(TypeError('响应类型的对象不是 JSON 可序列化的'))

TypeError:“标签”类型的对象不是 JSON 可序列化的

TypeError:mappingproxy 类型的对象不是 JSON 可序列化的