很郁闷的一件事情,写了ajax函数
$.ajax({
type: 'POST',
url: url,
success: function(data){
console.log("Data:------------------ "+data);
},
dataType: 'json'
});
后台console不报错,前端浏览器数据传回了已经,
前端不报错,但是总是不进success。Preview里面显示返回的是字符串不是json。
解决方案:
1》到底进那里了,不成功则失败,进error看看
$.ajax({
type: 'POST',
url: url,
success: function(data){
console.log("Data:------------------ "+data);
},
error: function(msg){
console.log("msg:------------------ "+msg);
},
dataType: 'json'
});
2》查看error中的msg
数据确实返回回来了,原因大概知道了,后台json构建失败,返回了responseText
3》此时,https://www.bejson.com/,把数据导入到此界面,结果特么校验正常。
如下原因会造成JSON校验失败,而且会让你不知道为什么失败
JSON字符串里的非数字型键值没有双引号
JSON中存在\t这样的制表符,看起来和空格一样,但是就是因为它的存在校验不通过。去掉就能过了。
编辑器有bom头也会造成
4》后端检验:
public static boolean isJson(String value) {
try {
new JSONObject(value);
} catch (JSONException e) {
e.printStackTrace();
return false;
}
return true;
}
失败了,哈哈哈,报错
org.json.JSONException: Unterminated string at 1247 [character 0 line 2]
at org.json.JSONTokener.syntaxError(JSONTokener.java:433)
at org.json.JSONTokener.nextString(JSONTokener.java:260)
at org.json.JSONTokener.nextValue(JSONTokener.java:360)
at org.json.JSONArray.<init>(JSONArray.java:115)
at org.json.JSONTokener.nextValue(JSONTokener.java:366)
at org.json.JSONObject.<init>(JSONObject.java:214)
at org.json.JSONObject.<init>(JSONObject.java:321)
at cn.wawi.controller.mjl.HiddenTroubleController.isJson(HiddenTroubleController.java:689)
at cn.wawi.controller.mjl.HiddenTroubleController.getDutyPersonStatistics(HiddenTroubleController.java:678)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at com.jfinal.aop.Invocation.invoke(Invocation.java:73)
at cn.wawi.common.interceptor.GlobalInterceptor.intercept(GlobalInterceptor.java:47)
at com.jfinal.aop.Invocation.invoke(Invocation.java:67)
at com.jfinal.core.ActionHandler.handle(ActionHandler.java:74)
at com.jfinal.ext.handler.ContextPathHandler.handle(ContextPathHandler.java:47)
at com.jfinal.core.JFinalFilter.doFilter(JFinalFilter.java:72)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:94)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:504)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:620)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:502)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1104)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:684)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1519)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1475)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745)
5》我特么实在不知道怎么搞这些脏数据了。
解决方案:(1)后端费力死,处理这些垃圾
(2)前端既然不报错,那就在error返回中处理这些垃圾,该处理处理。
其实第3》有问题,我处理了一个回车。这个情况就是String字符串太长的话就会自动换行。
String构建的字符串在1247会自动换行(没有实际测量看异常得知)。
转化json字符串的时候改方法,传入StringBuffer对象,异常解决。
其实,就是数据库里面有脏数据,有\n,去掉之后,世界忽然变的好顺畅。