Unexpected end of JSON input

业务逻辑如下:

1、前端ajax调用后台controller方法,controller中调用外部http接口,封装了一个HttpURLConnection对象的调用方法。目前对端接口还未完成,所以本地编写接口接收http请求处理并返回。前端页面始终报:

SyntaxError: Unexpected end of JSON input
    at parse (<anonymous>)
    at Ut (jquery-3.3.1.min.js:2)
    at k (jquery-3.3.1.min.js:2)
    at XMLHttpRequest.<anonymous> (jquery-3.3.1.min.js:2)
    at Object.send (jquery-3.3.1.min.js:2)
    at Function.ajax (jquery-3.3.1.min.js:2)
    at findWorkOrderInfo (initGroup.action?userId=402880e92db726b5012db729f65f0001&groupId=403880e92db726b5012db729f65f0002&chatId=297e60f264f472170164f501db7d038e:66)
    at HTMLImageElement.onclick (initGroup.action?userId=402880e92db726b5012db729f65f0001&groupId=403880e92db726b5012db729f65f0002&chatId=297e60f264f472170164f501db7d038e:135)

前端代码大致如下:

$.ajax({
			url : url,
			data : data,
			dataType : 'json',
			type : 'POST',
			async:false,
			success : function(obj) {
			},
			error:function(data,type,err){
				console.log(data);
				console.log(type);
				console.log(err);
			}
		});

检查过多次没有什么问题,基本上可以判断是后台返回数据的问题。

1、现在开始debugger后台代码,首先根据错误怀疑是拼接的json串不符合格式,因此在返回语句将结果字符串拷贝出来检查,发现没有问题;

2、然后将代码都注释掉,只保留返回json串的语句,直接返回结果,前端页面正确解析,因此怀疑是处理逻辑中存在问题。

3、会出问题的代码主要集中在调用外部接口返回数据的部分,将这部分代码注释掉,返回固定结果,前端正确解析,因此确定是调用接口的问题。

4、因为报错是Unexpected end of JSON input,怀疑是否是请求头设置的问题,但是请求外部接口时设置的Content-Type确实是application/json;charset=UTF-8,然后开始检查封装的接口调用方法,一步步注释掉测试定位到问题出在HttpURLConnection对象调用getInputStream()方法这里,因为这个方法是真正执行发送请求的方法,就开始怀疑是否是request对象或response对象出了问题。

5、因为编写的测试接口返回结果使用的是response.getWriter().println()方法返回字符串,并且debug看到返回的结果也没有问题。怀疑是否是response对象的一些属性有问题,然后在debug过程中偶然将外部接口中的response对象和ajax调用的controller方法中的response比较了一下,发现response对象的ID相同。。。到这了问题基本上找到了,我们知道一个request只能对应一个response,即response对象只能使用一次,因为我调用外部接口就使用了这个response对象,导致再返回结果给ajax时再使用这个response对象就出问题了。然后发现我编写的测试接口和ajax调用的方法都在一个controller类中,这就导致它们使用的是相同的response对象。

6、到这里问题基本上清楚了,将编写的测试接口放到一个新的controller类中,这样ajax调用的方法和外部接口就不在一个controller类中了,当在后台再次调用外部接口时就会使用新的response对象,获取结果之后再通过原来的response对象返回结果到前端,测试成功。。。

这里也算是给自己挖了个坑,以后在对端接口还未完成,自己编写接口进行测试时,要记得不要偷懒和调用方写在一个类中,也许就会在两次调用使用同一个response对象,导致出现难以察觉的错误。。。

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
回答: "unexpected end of json input"错误通常是由于JSON数据格式不完整或解析错误导致的。根据您提供的引用内容,可能有以下几个原因导致这个错误的出现。引用中提到,当使用JSON.parse()时,括号里的值不能为空。如果值为空,就会报错。另外,引用指出,如果JSON数据中包含特殊字符(如问号、和&符号),在传递参数前需要使用JSON.stringify转换为字符串,并使用encodeURIComponent进行编码。接收数据时,需要先使用decodeURIComponent进行解码,然后再使用JSON.parse将其转换为JSON格式的对象或数组。因此,您可以检查您的代码,确保JSON数据格式完整,并根据需要进行相应的编码和解码操作,以避免"unexpected end of json input"错误的发生。123 #### 引用[.reference_title] - *1* [解析JSON报错Unexpected end of JSON input](https://blog.csdn.net/qq_45610622/article/details/128255271)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}} ] [.reference_item] - *2* *3* [解决Unexpected end of JSON input 报错](https://blog.csdn.net/qq_41288473/article/details/122964895)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值