response返回的不是json


問題

前端ajax請求設置返回類型為json

 $.ajax({
            url:path+"/getData",    //請求的url地址
            dataType:'json',
            beforeSend: function (XMLHttpRequest) {
                XMLHttpRequest.setRequestHeader("token", 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiIxNTgxMDY2NTQ3OSIsImlhdCI6MTYyODY3OTIyOH0.mhkJrDKM82BdQLf2rqlouRyZMCMGLb9HSJQhDmZRcQk');
            },
            contentType:"application/json;charset=utf-8",
            async:false,//請求是否異步,默認為異步,這也是ajax重要特性
            data:encryRsa,    //參數值
            type:"POST",   //請求方式
            success:function(data){
                //請求成功時處理
                console.log(data);
                var obj = eval('(' + data+ ')');
                console.log(obj);
                if(obj.data != null){
                    console.log(obj.data);
                }
            },

        });

或者vue的axios請求設置返回為json

axios.post('http://127.0.0.1/api/getData', rsaStr,{
            headers: {
              'Content-Type': 'application/json',
              // 'token':'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiIxNTgxMDY2NTQ3OSIsImlhdCI6MTYyODY2NzkzNH0.U0Zc6nHakGVUZ9eHxkKO9k1MnGhk74BzC5OldZ0oVRQ'
              'token':window.localStorage.getItem('token')
            },
            responseType: 'json'
          }).then((res)=>{
              let obj = eval('(' + res.data+ ')');
              console.log(obj);
            }).catch(function (error) {
              console.log(error);
            });

當后台服務正常是通過注解@Responsebody

在正常情況下,從其它API 返回給前端的結果都是json字符串,前端可以正確解析

但遇到一些異常的情況,返回給前端的結果卻是json對象數據,key少了雙引號,前端無法正確解析

原因是

@ RestController或者@Responsebody 注解自動將對象轉成了json字符串

而 response.getWriter().write() 是直接將json對象寫進去,並沒有自動轉換成json字符串格式

private void responseResult(HttpServletResponse response, Result<?> result) {
        response.setCharacterEncoding("UTF-8");
        response.setHeader("Content-Type", "application/json");
        response.setHeader("Access-Control-Allow-Credentials", "true");
        response.setHeader("Access-Control-Allow-Methods", "GET, POST");
        response.setHeader("Access-Control-Allow-Origin", "*");
        response.setHeader("Access-Control-Max-Age", "3600");
//        response.setHeader("Content-type", "application/json;charset=UTF-8");
        response.setStatus(HttpServletResponse.SC_OK);
        response.setContentType("application/json;charset=UTF-8");
//        ServletOutputStream out = null;
        PrintWriter writer=null;
        try {
            // JSON.toJSONString(result)要獲取完整的json字符串,每一個字段都要有set和get方法,不然會缺少某個字段
//            response.getWriter().write(JSON.toJSONString(result));
            writer=response.getWriter();
//            writer.write(result.toString());
            writer.write(JSON.toJSONString(result));
            writer.flush();
        } catch (IOException ex) {
            logger.error(ex.getMessage());
        }finally {
            if(writer!=null) {
                writer.close();
            }
        }
    }

而至於重寫的toString()方法為什么沒有直接返回json字符串

JSON.toJSONString(resultMap, SerializerFeature.WRITE_MAP_NULL_FEATURES)  返回的字符串中,key 是沒有雙引

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM