java返回json請(qǐng)求中文變成問號(hào)的問題及解決
java返回json請(qǐng)求中文變成問號(hào)
原來在個(gè)人項(xiàng)目時(shí),用layui的數(shù)據(jù)表格獲取數(shù)據(jù)時(shí),不會(huì)出現(xiàn)中文變問號(hào)問題
后來換了個(gè)項(xiàng)目,發(fā)現(xiàn)返回的json數(shù)據(jù)到頁面中文變成了???問號(hào)。
于是開始排查問題出現(xiàn)的原因,首先jsp頁面頭部確保使用了UTF-8編碼:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
既然不是頁面的問題,肯定就是后臺(tái)問題,之前的后臺(tái)代碼是:
? ? /** ?? ? * 獲取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;} ?? ??? ?// //校驗(yàn)權(quán)限 ?? ??? ?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列表?? ?? ?? ??? ??? ?//前臺(tái)通過key值獲得對(duì)應(yīng)的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(); ? ? }
排查了一下,發(fā)現(xiàn)在這段代碼上加上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;} ?? ??? ?// //校驗(yàn)權(quán)限 ?? ??? ?PageData pd = this.getPageData(); ? ? ? ? response.setContentType("text/html;charset=utf-8");// 加上這個(gè)處理問號(hào) ?? ??? ?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列表?? ?? ?? ??? ??? ?//前臺(tái)通過key值獲得對(duì)應(yīng)的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(); ? ? }
傳到頁面就不會(huì)出現(xiàn)中文亂碼了
原來的后來的項(xiàng)目的springmvc配置文件里面沒有相關(guān)的配置,之前的個(gè)人項(xiàng)目上有這段配置:
<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>
嗯,算是踩了個(gè)坑,分享一下
json返回中文全是問號(hào)
在RequestMapping里加上
produces = "text/plain;charset=UTF-8"
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
java開發(fā)ServiceLoader實(shí)現(xiàn)機(jī)制及SPI應(yīng)用
這篇文章主要為大家介紹了java開發(fā)ServiceLoader實(shí)現(xiàn)機(jī)制及SPI應(yīng)用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10springboot讀取resource配置文件生成容器對(duì)象的示例代碼
這篇文章主要介紹了springboot讀取resource配置文件生成容器對(duì)象的示例代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-07-07Java通俗易懂系列設(shè)計(jì)模式之責(zé)任鏈模式
這篇文章主要介紹了Java通俗易懂系列設(shè)計(jì)模式之責(zé)任鏈模式,對(duì)設(shè)計(jì)模式感興趣的同學(xué),一定要看一下2021-04-04舉例解析Java多線程編程中需要注意的一些關(guān)鍵點(diǎn)
這篇文章主要介紹了Java多線程編程中需要注意的一些關(guān)鍵點(diǎn),包括ThreadLocal變量與原子更新等一些深層次的內(nèi)容,需要的朋友可以參考下2015-11-11springboot框架中如何整合mybatis框架思路詳解
這篇文章主要介紹了springboot框架中如何整合mybatis框架,本文通過示例圖文相結(jié)合給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-12-12淺析Java中對(duì)象的創(chuàng)建與對(duì)象的數(shù)據(jù)類型轉(zhuǎn)換
這篇文章主要介紹了Java中對(duì)象的創(chuàng)建與對(duì)象的數(shù)據(jù)類型轉(zhuǎn)換,是Java入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2016-01-01SpringBoot+kaptcha實(shí)現(xiàn)驗(yàn)證碼花式玩法詳解
這篇文章主要想和大家聊聊kaptcha的用法,畢竟這個(gè)已經(jīng)有16年歷史的玩意還在有人用,說明它的功能還是相當(dāng)強(qiáng)大的,感興趣的小伙伴可以了解一下2022-05-05身份證號(hào)碼驗(yàn)證算法深入研究和Java實(shí)現(xiàn)
這篇文章主要介紹了身份證號(hào)碼驗(yàn)證算法深入研究和Java實(shí)現(xiàn),本文講解了18身份證號(hào)碼的結(jié)構(gòu)、根據(jù)17位數(shù)字本體碼獲取最后一位校驗(yàn)碼程序?qū)嵗葍?nèi)容,需要的朋友可以參考下2015-06-06