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

如何从Servlet返回JSON?代码异常求排查修正

嘿,我帮你梳理下Servlet返回JSON失败的可能问题,先从后端代码入手,再给前端JS的常见错误修正方案~

先搞定Servlet端的关键细节

你贴的代码里response.setContentType("application/json")后面明显没写完,这大概率是导致前端收不到正确JSON的核心原因之一。完整的Servlet处理逻辑得把这些步骤补全:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // 假设ls是已经初始化好的业务实例
    String enduser = ls.ReturnEndUser();
    Utente user = ls.getUserByUsername(enduser);
    
    // 用Gson序列化对象为JSON字符串
    String json = new Gson().toJson(user);
    System.out.println("il JSON è " + json);
    
    // 关键:设置响应的内容类型+编码,避免乱码
    response.setContentType("application/json;charset=UTF-8");
    response.setCharacterEncoding("UTF-8");
    
    // 把JSON写入响应输出流,前端才能收到数据
    PrintWriter out = response.getWriter();
    out.print(json);
    out.flush();
    out.close();
}

这里要注意两个点:

  • 必须加charset=UTF-8,不然如果Utente里有中文,肯定会乱码
  • 一定要把JSON字符串写入响应输出流,不然前端啥都拿不到

前端JS的常见坑及修正

既然你怀疑JS有问题,给你列几种高频错误场景:

场景1:用普通跳转/表单提交而非AJAX

如果是直接点a标签或者提交form,浏览器会把JSON当成纯文本显示,不会触发JS逻辑。得用AJAX请求,比如原生JS写法:

const xhr = new XMLHttpRequest();
xhr.open('GET', '你的Servlet路径', true);
// 明确告诉服务器我们要JSON格式的响应
xhr.setRequestHeader('Accept', 'application/json');

xhr.onload = function() {
    if (xhr.status >= 200 && xhr.status < 300) {
        // 解析JSON数据
        const user = JSON.parse(xhr.responseText);
        console.log('拿到的用户数据:', user);
        // 这里可以做渲染页面之类的操作
    } else {
        console.error('请求炸了,状态码:', xhr.status);
    }
};

xhr.onerror = function() {
    console.error('网络出错啦!');
};

xhr.send();

场景2:JSON解析失败

如果Servlet已经返回了JSON,但JS解析报错,先检查:

  • 浏览器F12的Network面板里,看Response的内容是不是合法的JSON(比如有没有语法错误)
  • 别用eval()解析,一定要用JSON.parse(),安全又靠谱
  • 确认Servlet返回的JSON格式和你前端预期的结构一致

场景3:跨域问题

如果前端页面和Servlet不在同一个域名/端口,浏览器会拦截响应。这种情况要在Servlet里加跨域头:

// 加到doGet方法里
response.setHeader("Access-Control-Allow-Origin", "*"); // 生产环境别用*,指定具体域名更安全
response.setHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
response.setHeader("Access-Control-Allow-Headers", "Content-Type, Accept");

调试小技巧

  1. 直接在浏览器地址栏访问Servlet的路径,看能不能看到正确的JSON字符串——如果看不到,先把后端问题解决
  2. 打开F12的Network面板,看请求的状态码:
    • 404:Servlet的路径配错了,检查web.xml或者@WebServlet注解的路径
    • 500:后端代码报错了,看控制台的异常信息(比如ls没初始化,getUserByUsername返回null之类的)
    • 200但响应内容不对:检查Gson序列化是否正常,有没有空指针问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:40:53