You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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数据后,就能动态把结果渲染到页面上,而不是只在命令行输出。

总结一下

  1. 所有numpy数值类型都要转换成Python原生类型,避免JSON序列化报错
  2. 视图函数要把处理结果通过render传给模板,或者返回JsonResponse给前端,别只用print输出

内容的提问来源于stack exchange,提问作者najmath

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 10:03:59