Ajax触发Unexpected end of JSON input报错的原因排查
Unexpected end of JSON input 报错原因定位 这个报错的触发逻辑非常直白:前端执行JSON解析操作时,拿到的待解析内容是空字符串、空值,或是被截断到根本拼不成合法JSON结构的残缺内容。结合你贴的前后端代码,常见的触发原因按排查优先级排列:
- 后端JSON编码直接执行失败,输出空内容
你现在后端的逻辑是直接echo json_encode($departTickets),完全没做编码结果校验:如果$departTickets里的字符串不是UTF-8编码、包含PHP资源类型这种没法被序列化的内容,或是数组嵌套深度超过PHP默认的json_encode限制,json_encode会直接返回false。这时候echo false的最终输出就是空字符串,前端拿空值调用jQuery.parseJSON(res),百分之百会触发这个报错。 - 后端有多余的输出干扰,把JSON结构破坏
比如fetchtickets.php文件开头/结尾残留了BOM头、无意义的换行空格,或是代码里提前输出了PHP的Warning/Notice报错信息、其他调试用的echo内容,本来合法的JSON会被这些杂文本挤成残缺内容,甚至直接把JSON截断。要是代码里在echo json_encode之前就提前exit、走了重定向逻辑,根本没走到返回JSON的分支,响应体就会是完全空的状态。 - AJAX请求压根没拿到正确的接口响应
比如你填的接口路径/desk/template/fetchtickets.php实际不存在,服务器返回空的404响应,或是被权限校验拦截返回了空的未授权提示,前端拿到的根本不是预期的JSON结构。
快速定位问题的方法
直接在success回调的第一行加console.log('接口原始返回内容:', res),先确认res到底是什么:
- 如果打出来是空字符串,优先回去查后端:在echo之前判断
json_encode($departTickets)的返回值,如果是false就直接输出json_last_error_msg()看具体编码失败的原因;同时把PHP文件里所有多余的换行、BOM头清掉,在返回JSON前加header('Content-Type: application/json; charset=utf-8')明确响应格式,临时关掉PHP的错误提示输出避免warning干扰。 - 如果打出来的内容混有warning文本、HTML标签,把对应的多余输出删掉就行。
另外提一句你代码里的小逻辑问题:就算JSON解析成功,你现在写的for (var jsonId in data)拿到的是数组的索引键,根本不是实际的票务数据,最后塞到页面上的也只是数字索引,这个后续也需要调整,和当前的JSON解析报错无关。
内容的提问来源于stack exchange,提问作者Kevin
相关产品推荐
相关产品推荐

