java返回json請求中文變成問號的問題及解決

java返回json請求中文變成問號

原來在個人項目時,用layui的數據表格獲取數據時,不會出現中文變問號問題

後來換瞭個項目,發現返回的json數據到頁面中文變成瞭???問號。

於是開始排查問題出現的原因,首先jsp頁面頭部確保使用瞭UTF-8編碼:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

既然不是頁面的問題,肯定就是後臺問題,之前的後臺代碼是:

    /**
     * 獲取json列表
     */
    @ResponseBody
    @RequestMapping("/getJsonAF02")
    public void getManyCategory(Page page, HttpServletRequest request,HttpServletResponse response) throws  Exception{
        logBefore(logger, "列表AF02");
        // if(!Jurisdiction.buttonJurisdiction(menuUrl, "cha")){return null;}
        // //校驗權限
        PageData pd = this.getPageData();
        JSONObject jsonObject = new JSONObject();    
        PrintWriter out = response.getWriter();
        try {
            page.setPd(pd);
            page.setCurrentPage(Integer.parseInt(pd.getString("page")));
            pd.put("OPERATION_NUM", "10001");
 
            List<PageData> varList = af02Service.listForSCJ(page); // 列出AF02列表     
            //前臺通過key值獲得對應的value值
            jsonObject.put("code", 0);     
            jsonObject.put("msg", "測試");    
            jsonObject.put("count",page.getTotalResult());    
            jsonObject.put("data", varList);
        } catch (Exception e) {
            logger.error(e.toString(), e);
        }
        String result = jsonObject.toString();
        out.write(result);
        out.close();
    }

排查瞭一下,發現在這段代碼上加上response.setContentType("text/html;charset=utf-8");:

  /**
     * 獲取json列表
     */
    @ResponseBody
    @RequestMapping("/getJsonAF02")
    public void getManyCategory(Page page, HttpServletRequest request,HttpServletResponse response) throws  Exception{
        logBefore(logger, "列表AF02");
        // if(!Jurisdiction.buttonJurisdiction(menuUrl, "cha")){return null;}
        // //校驗權限
        PageData pd = this.getPageData();
        response.setContentType("text/html;charset=utf-8");// 加上這個處理問號
        JSONObject jsonObject = new JSONObject();    
        PrintWriter out = response.getWriter();
        try {
            page.setPd(pd);
            page.setCurrentPage(Integer.parseInt(pd.getString("page")));
            pd.put("OPERATION_NUM", "10001");
 
            List<PageData> varList = af02Service.listForSCJ(page); // 列出AF02列表     
            //前臺通過key值獲得對應的value值
            jsonObject.put("code", 0);     
            jsonObject.put("msg", "測試");    
            jsonObject.put("count",page.getTotalResult());    
            jsonObject.put("data", varList);
        } catch (Exception e) {
            logger.error(e.toString(), e);
        }
        String result = jsonObject.toString();
        out.write(result);
        out.close();
    }

傳到頁面就不會出現中文亂碼瞭

原來的後來的項目的springmvc配置文件裡面沒有相關的配置,之前的個人項目上有這段配置:

<mvc:annotation-driven>
        <mvc:message-converters register-defaults="true">
        <bean id="stringHttpMessageConverter" class="org.springframework.http.converter.StringHttpMessageConverter">
                <property name="supportedMediaTypes"  value="application/json;charset=UTF-8"/>
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>

嗯,算是踩瞭個坑,分享一下

json返回中文全是問號

在RequestMapping裡加上

produces = "text/plain;charset=UTF-8"

以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。

推薦閱讀: