如何从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");
调试小技巧
- 直接在浏览器地址栏访问Servlet的路径,看能不能看到正确的JSON字符串——如果看不到,先把后端问题解决
- 打开F12的Network面板,看请求的状态码:
- 404:Servlet的路径配错了,检查web.xml或者@WebServlet注解的路径
- 500:后端代码报错了,看控制台的异常信息(比如ls没初始化,getUserByUsername返回null之类的)
- 200但响应内容不对:检查Gson序列化是否正常,有没有空指针问题
内容的提问来源于stack exchange,提问作者Dani
相关产品推荐
相关产品推荐

