天天看點

JSON.stringify()之轉義符(反斜杠)解決辦法JSON.stringify()出現轉義符無法發送請求到後端的解決方法

JSON.stringify()出現轉義符無法發送請求到後端的解決方法

話不多說,直接上報錯代碼。

16:10:43.326 [http-nio-8888-exec-23] ERROR com.platform.utils.RRExceptionHandler - JSON parse error: Unexpected character ('\' (code 92)): was expecting comma to separate Object entries; nested exception is com.fasterxml.jackson.core.JsonParseException: Unexpected character ('\' (code 92)): was expecting comma to separate Object entries
 at [Source: (PushbackInputStream); line: 1, column: 247]
org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Unexpected character ('\' (code 92)): was expecting comma to separate Object entries; nested exception is com.fasterxml.jackson.core.JsonParseException: Unexpected character ('\' (code 92)): was expecting comma to separate Object entries
 at [Source: (PushbackInputStream); line: 1, column: 247]
	at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:245)
	at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.read(AbstractJackson2HttpMessageConverter.java:227)
	at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodArgumentResolver.readWithMessageConverters(AbstractMessageConverterMethodArgumentResolver.java:204)
	at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.readWithMessageConverters(RequestResponseBodyMethodProcessor.java:157)
	at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.resolveArgument(RequestResponseBodyMethodProcessor.java:130)
	at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:126)
	at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:167)
	at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:134)
	at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:892)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:797)
	at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1039)
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:942)
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1005)
	at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:908)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:660)
	at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:882)
	at java.lang.Thread.run(Thread.java:748)
Caused by: com.fasterxml.jackson.core.JsonParseException: Unexpected character ('\' (code 92)): was expecting comma to separate Object entries
 at [Source: (PushbackInputStream); line: 1, column: 247]
	at com.fasterxml.jackson.core.JsonParser._constructError(JsonParser.java:1804)
	at com.fasterxml.jackson.core.base.ParserMinimalBase._reportError(ParserMinimalBase.java:693)
	at com.fasterxml.jackson.core.base.ParserMinimalBase._reportUnexpectedChar(ParserMinimalBase.java:591)
	at com.fasterxml.jackson.core.json.UTF8StreamJsonParser.nextFieldName(UTF8StreamJsonParser.java:986)
	at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:376)
	at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:159)
	at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4013)
	at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3084)
	at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:239)
	... 81 common frames omitted
           

從報錯資訊來看是json轉換格式的異常,OK,找到前端轉換json的代碼。繼續上代碼。。。

let url = vm.goods.id == null ? "../goods/save" : "../goods/update";
            vm.goods.goodsDesc = $('#goodsDesc').editable('getHTML');
            vm.goods.goodsImgList = vm.uploadList;
            Ajax.request({
                type: "POST",
                url: url,
                contentType: "application/json",
                params: JSON.stringify(vm.goods),
                successCallback: function (r) {
                    alert('操作成功', function (index) {
                        vm.reload();
                    });
                }
            });
           

嗯哼,params是用JSON.stringify()格式化的,基本可以确定是它的問題了。下一步,列印參數驗證,為了更直覺的看見參數,我舍棄了alert,用console.log();

等待兩秒,1秒、2秒,duang,果然不出我所料,報錯資訊所指的就是這玩意兒(轉義符)。

JSON.stringify()之轉義符(反斜杠)解決辦法JSON.stringify()出現轉義符無法發送請求到後端的解決方法

emmmm…想辦法解決吧。簡單思考了幾種方法,算了,先百度吧。

百度結果:1、消除轉義符。2、改變發送請求類型。3、自己想辦法解決。腦子懶,先試試消除轉義符。上代碼:

duang不出我所料,又報錯了。。。

ERROR com.platform.utils.RRExceptionHandler - JSON parse error: Unexpected character ('h' (code 104)): was expecting comma to separate Object entries; nested exception is com.fasterxml.jackson.core.JsonParseException: Unexpected character ('h' (code 104)): was expecting comma to separate Object entries
 at [Source: (PushbackInputStream); line: 1, column: 247]
org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Unexpected character ('h' (code 104)): was expecting comma to separate Object entries; nested exception is com.fasterxml.jackson.core.JsonParseException: Unexpected character ('h' (code 104)): was expecting comma to separate Object entries
 at [Source: (PushbackInputStream); line: 1, column: 247]
           

emmmmm…抱着不可能的想法試試第二種方法。。。

嗯?好像也沒什麼類型可換。

emmmmmm…contentType好像少了點什麼,诶,不對啊。contentType主要設定我發送給伺服器的格式,我後端設定的斷點并沒有被觸發,也就是後端并沒有接收到我前端的請求。contentType的預設值是application/x-www-form-urlencoded,但是預設的值隻能對鍵值這樣組織的情況下是沒有什麼問題的,這裡說的一般是,不帶嵌套類型JSON,也就是 簡單的JSON。

{
	a:1,
	b:2
}
           

但是我發送的是一個複雜嵌套類型:

{
 data: {
   a: [{
     b: 1
   }]
 }
}
           

是以我用了自定義資料類型application/json,這。。。是不是忘了加編碼格式了?帶着疑問我浏覽了contentType的原文介紹:

contentType中(預設:‘application/x-www-form-urlencoded; charset=UTF-8’) 類型:布爾值或字元串 将資料發送到伺服器時,請使用此内容類型。預設為“application / x-www-form-urlencoded; charset = UTF-8”,這在大多數情況下都适用。如果您明确地将内容類型傳入$.ajax(),則始終将其發送到伺服器(即使沒有資料發送)。從jQuery 1.6開始,您可以傳遞false告訴jQuery不設定任何内容類型标頭。 注意: W3C XMLHttpRequest規範規定字元集始終為UTF-8; 指定另一個字元集不會強制浏覽器更改編碼。注意:對于跨域請求,将内容類型設定為除application/x-www-form-urlencoded,之外的任何内容multipart/form-data,或者text/plain将觸發浏覽器向伺服器發送預檢OPTIONS請求。

加上編碼格式後:

let url = vm.goods.id == null ? "../goods/save" : "../goods/update";
            vm.goods.goodsDesc = $('#goodsDesc').editable('getHTML');
            vm.goods.goodsImgList = vm.uploadList;
            Ajax.request({
                type: "POST",
                url: url,
                contentType: "application/json;charset-utf-8",
                params: eval1,
                successCallback: function (r) {
                    alert('操作成功', function (index) {
                        vm.reload();
                    });
                }
            });
           

啟動,激動的心,顫抖的手,duang!

JSON.stringify()之轉義符(反斜杠)解決辦法JSON.stringify()出現轉義符無法發送請求到後端的解決方法

問題解決。。。

本文簡單記載我開發過程遇到的一個小問題,有興趣的童鞋可以自己翻閱相關資料以更深入了解這個問題的所在。本文僅代表個人觀點,如有錯誤地方請提出寶貴建議,以便交流學習。

JSON.stringify()之轉義符(反斜杠)解決辦法JSON.stringify()出現轉義符無法發送請求到後端的解決方法