int32对象无法JSON序列化及症状匹配页面不显示问题求助
解决两个问题:JSON序列化错误与HTML页面不显示内容
看起来你碰到了两个关联的小麻烦:一个是numpy int32类型无法JSON序列化的报错,另一个是处理结果只在命令行输出而没传到HTML页面。咱们一步步拆解解决:
1. 修复「TypeError: Object of type 'int32' is not JSON serializable」错误
这个报错的核心原因是numpy的int32不是Python原生的int类型,而JSON序列化器默认只认Python原生数据类型。你的代码里用到了np.array,大概率是在匹配症状的过程中,把numpy的int32值混入了要返回的数据里。
解决起来很简单:把所有numpy数值类型转换成Python原生int就行。比如修改你代码里的循环逻辑:
for dicti in dictionary: # 把字典里的症状从numpy int32转成原生int dict_symptoms = [int(s) for s in dicti['symptoms']] if set(sym) <= set(dict_symptoms) and len(sym)...
如果后续需要把结果转成JSON返回(比如给前端AJAX用),还可以自定义一个序列化器来自动处理numpy类型:
import json import numpy as np class NumpyEncoder(json.JSONEncoder): def default(self, 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() return super(NumpyEncoder, self).default(obj) # 使用时直接传入cls参数 json_result = json.dumps(your_matched_data, cls=NumpyEncoder)
2. 让结果显示在HTML页面而不是只打印在命令行
你说内容只在命令行打印,说明你的predict视图函数没有正确把结果传递给HTML模板,或者没返回包含结果的响应。结合Django框架的使用场景,给你两种常见解决方案:
方案一:通过模板渲染同步显示结果
修改predict函数,把匹配结果存入上下文,再传给HTML模板:
from django.shortcuts import render def predict(request): if request.method == 'POST': sym = request.POST.getlist('symptoms[]') sym = list(map(int, sym)) matched_diseases = [] for dicti in dictionary: dict_symptoms = [int(s) for s in dicti['symptoms']] if set(sym) <= set(dict_symptoms) and len(sym) > 0: # 把匹配到的疾病信息存入列表 matched_diseases.append({ 'name': dicti['disease_name'], 'symptoms': dict_symptoms }) # 把结果传给模板,替代print输出 return render(request, 'your_result_template.html', {'matched_diseases': matched_diseases}) # GET请求时返回初始页面 return render(request, 'your_input_template.html')
然后在你的HTML模板里,就可以遍历结果渲染:
{% if matched_diseases %} <h3>匹配到的疾病:</h3> <ul> {% for disease in matched_diseases %} <li> <strong>{{ disease.name }}</strong> <p>关联症状:{{ disease.symptoms|join:", " }}</p> </li> {% endfor %} </ul> {% endif %}
方案二:返回JSON给前端异步渲染
如果是用AJAX异步提交请求,视图函数可以直接返回JSON响应:
from django.http import JsonResponse def predict(request): if request.method == 'POST': sym = request.POST.getlist('symptoms[]') sym = list(map(int, sym)) matched_diseases = [] for dicti in dictionary: dict_symptoms = [int(s) for s in dicti['symptoms']] if set(sym) <= set(dict_symptoms) and len(sym) > 0: matched_diseases.append({ 'name': dicti['disease_name'], 'symptoms': dict_symptoms }) # 用自定义序列化器处理可能的numpy类型 return JsonResponse(matched_diseases, safe=False, encoder=NumpyEncoder)
这样前端拿到JSON数据后,就能动态把结果渲染到页面上,而不是只在命令行输出。
总结一下
- 所有numpy数值类型都要转换成Python原生类型,避免JSON序列化报错
- 视图函数要把处理结果通过
render传给模板,或者返回JsonResponse给前端,别只用print输出
内容的提问来源于stack exchange,提问作者najmath
相关产品推荐
相关产品推荐

