javascript
mvc json 乱码_你了解JSON吗?——Jackson、FastJson在SpringMVC中的简单使用
1. 什么是 JSON
JSON(JavaScript Object Notation, JS 對(duì)象標(biāo)記)- 是一種輕量級(jí)的數(shù)據(jù)交換格式
- 采用完全獨(dú)立于編程語(yǔ)言的文本格式來(lái)存儲(chǔ)和表示數(shù)據(jù)。
- 簡(jiǎn)潔和清晰的層次結(jié)構(gòu)使得 JSON 成為理想的數(shù)據(jù)交換語(yǔ)言。
- 易于人閱讀和編寫(xiě),也易于機(jī)器解析和生成,并有效地提升網(wǎng)絡(luò)傳輸效率。
在 JavaScript 語(yǔ)言中,一切都是對(duì)象。因此,任何JavaScript 支持的類(lèi)型都可以通過(guò) JSON 來(lái)表示,例如字符串、數(shù)字、對(duì)象、數(shù)組等。
2. JSON 語(yǔ)法規(guī)則
- 鍵值對(duì)表示對(duì)象,數(shù)據(jù)由逗號(hào)分隔
- 花括號(hào)保存對(duì)象
- 方括號(hào)保存數(shù)組
JSON 鍵值對(duì) 是用來(lái)保存 JavaScript 對(duì)象的一種方式
- 由花括號(hào)括起來(lái)的逗號(hào)分割的成員構(gòu)成
- 鍵值對(duì)組合中的鍵名寫(xiě)在前面并用雙引號(hào)""包裹,使用冒號(hào) :分隔,然后緊接著值
3. JSON 與 JS 對(duì)象的關(guān)系
JSON 是 JavaScript 對(duì)象的字符串表示法,它使用文本表示一個(gè) JS 對(duì)象的信息,本質(zhì)是一個(gè)字符串。var obj = {a: 'Hello', b: 'World'}; //這是一個(gè)對(duì)象,注意鍵名也是可以使用引號(hào)包裹的 var json = '{"a": "Hello", "b": "World"}'; //這是一個(gè) JSON 字符串,本質(zhì)是一個(gè)字符串4. JSON 和 JS 對(duì)象互轉(zhuǎn)
編寫(xiě)一個(gè)html頁(yè)面進(jìn)行測(cè)試<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>test</title> </head> <body> <script type="text/javascript">var user = {name: "zsr",age: 20,sex: "男"};console.log(user);//將js對(duì)象轉(zhuǎn)換為json對(duì)象var json = JSON.stringify(user);console.log(json);//將json對(duì)象轉(zhuǎn)換為js對(duì)象var obj = JSON.parse(json);console.log(obj); </script> </body> </html>運(yùn)行測(cè)試,查看控制臺(tái)信息:
- JSON就是一個(gè)字符串,不能展開(kāi)
- JavaScript是一個(gè)對(duì)象,可以展開(kāi)
5. 使用Jackson數(shù)據(jù)交互
Jackson 是一個(gè) Java 的用來(lái)處理 JSON 格式數(shù)據(jù)的類(lèi)庫(kù),性能非常好當(dāng)然不止這一個(gè)類(lèi)庫(kù),比如還有阿里巴巴的 fastjson 等等。
接下來(lái)我們簡(jiǎn)單介紹一下SpringMVC中Jackson的使用1、導(dǎo)入依賴(lài)
導(dǎo)入Jackson的jar包<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind --> <dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.11.2</version> </dependency>2、配置web.xml
配置SpringMVC需要的配置web.xml<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0"><!--1.注冊(cè)servlet--><servlet><servlet-name>SpringMVC</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!--通過(guò)初始化參數(shù)指定SpringMVC配置文件的位置,進(jìn)行關(guān)聯(lián)--><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:springmvc-servlet.xml</param-value></init-param><!-- 啟動(dòng)順序,數(shù)字越小,啟動(dòng)越早 --><load-on-startup>1</load-on-startup></servlet><!--所有請(qǐng)求都會(huì)被springmvc攔截 --><servlet-mapping><servlet-name>SpringMVC</servlet-name><url-pattern>/</url-pattern></servlet-mapping><!--SpringMVC內(nèi)置過(guò)濾器,防止中文亂碼--><filter><filter-name>encoding</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>utf-8</param-value></init-param></filter><filter-mapping><filter-name>encoding</filter-name><url-pattern>/</url-pattern></filter-mapping> </web-app>3、編寫(xiě)SpringMVC配置文件
springmvc-servlet.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttps://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/mvchttps://www.springframework.org/schema/mvc/spring-mvc.xsd"><!-- 自動(dòng)掃描指定的包,下面所有注解類(lèi)交給IOC容器管理 --><context:component-scan base-package="controller"/><!-- 視圖解析器 --><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"id="internalResourceViewResolver"><!-- 前綴 --><property name="prefix" value="/WEB-INF/jsp/" /><!-- 后綴 --><property name="suffix" value=".jsp" /></bean></beans>4、編寫(xiě)實(shí)體類(lèi) (lombok)
編寫(xiě)一個(gè)User的實(shí)體類(lèi),然后我們?nèi)ゾ帉?xiě)我們的測(cè)試Controller;package pojo;import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor;@Data @AllArgsConstructor @NoArgsConstructor public class User {private String name;private int age;private String sex; }5、編寫(xiě)Controller
@Controller public class UserController {@RequestMapping("/j1")@ResponseBody //它不會(huì)走視圖解析器,會(huì)直接返回一個(gè)字符串public String json1() {//創(chuàng)建一個(gè)對(duì)象User user = new User("zsr", 20, "男");return user.toString();} }這里我們使用了@ResponseBody注解,他是配合@Controller使用的,該注解可以使不走視圖解析器,而是直接返回一個(gè)字符串
同樣可以直接將@Controller替換為@RestController,也可以達(dá)到不走視圖解析器,直接返回字符串的效果,此時(shí)就不用使用@ResponseBody注解了
6、運(yùn)行測(cè)試
配置Tomcat,點(diǎn)擊運(yùn)行,訪問(wèn)http://localhost:8080/j1,結(jié)果如下
我們并沒(méi)有通過(guò)視圖解析器,而是直接返回了字符串
7、轉(zhuǎn)換為JSON格式
如果我們想以json的格式進(jìn)行輸出,除了上述@ResponseBody注解之外,還需要一個(gè)objectMapper對(duì)象我們修改上述Controller
@Controller public class UserController {@RequestMapping("/j1")@ResponseBody //它不會(huì)走視圖解析器,會(huì)直接返回一個(gè)字符串public String json1() throws JsonProcessingException {//創(chuàng)建jackson的對(duì)象映射器,用來(lái)解析數(shù)據(jù)ObjectMapper mapper = new ObjectMapper();//創(chuàng)建一個(gè)對(duì)象User user = new User("zsr", 20, "男");//將對(duì)象轉(zhuǎn)換成json格式String str = mapper.writeValueAsString(user);//由于@ResponseBody注解,這里會(huì)將str轉(zhuǎn)成json格式返回;十分方便return str;} }重新運(yùn)行測(cè)試,同行訪問(wèn)http://localhost:8080/j1,成功以json的格式進(jìn)行顯示!
但是還存在亂碼問(wèn)題,我們需要設(shè)置一下他的編碼格式為utf-8,以及它返回的類(lèi)型;
這里可以通過(guò)@RequestMapping的produces屬性來(lái)實(shí)現(xiàn),修改下代碼
//produces:指定響應(yīng)體返回類(lèi)型和編碼 @RequestMapping(value = "/json1",produces = "application/json;charset=utf-8")再次測(cè)試,亂碼問(wèn)題得到解決
8、代碼優(yōu)化
1. 亂碼問(wèn)題
上述設(shè)置@RequestMapping中produces屬性值的方式比較麻煩,如果項(xiàng)目中有多個(gè)controller則每一個(gè)都要添加
可以通過(guò)Spring配置統(tǒng)一指定,在SpringMVC配置文件中加入如下代碼即可<!--json亂碼問(wèn)題配置--> <mvc:annotation-driven><mvc:message-converters register-defaults="true"><bean class="org.springframework.http.converter.StringHttpMessageConverter"><constructor-arg value="UTF-8"/></bean><bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"><property name="objectMapper"><bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean"><property name="failOnEmptyBeans" value="false"/></bean></property></bean></mvc:message-converters> </mvc:annotation-driven>2. 返回json字符串統(tǒng)一解決
上述我們使用了@ResponseBody注解,他是配合@Controller使用的,該注解可以使不走視圖解析器,而是直接返回一個(gè)字符串
同樣可以直接將@Controller替換為@RestController,也可以達(dá)到不走視圖解析器,直接返回字符串的效果,此時(shí)就不用使用@ResponseBody注解了
@RestController public class UserController {@RequestMapping(value = "/json1")public String json1() throws JsonProcessingException {//創(chuàng)建一個(gè)jackson的對(duì)象映射器,用來(lái)解析數(shù)據(jù)ObjectMapper mapper = new ObjectMapper();//創(chuàng)建一個(gè)對(duì)象User user = new User("zsr", 20, "男");//將我們的對(duì)象解析成為json格式String str = mapper.writeValueAsString(user);//由于@RestController注解,這里會(huì)將str轉(zhuǎn)成json格式返回;十分方便return str;} }9、測(cè)試集合輸出
增加一個(gè)新的方法,多個(gè)對(duì)象的情況下,我們會(huì)將其放在一個(gè)集合中@RequestMapping(value = "/j2") public String json2() throws JsonProcessingException {//創(chuàng)建jackson的對(duì)象映射器,用來(lái)解析數(shù)據(jù)ObjectMapper mapper = new ObjectMapper();//創(chuàng)建容器List<User> list = new ArrayList<User>();//創(chuàng)建多個(gè)對(duì)象User user1 = new User("zsr1", 20, "男");User user2 = new User("zsr2", 20, "男");User user3 = new User("zsr3", 20, "男");User user4 = new User("zsr4", 20, "男");User user5 = new User("zsr5", 20, "男");//將所有對(duì)象存入容器list.add(user1);list.add(user2);list.add(user3);list.add(user4);list.add(user5);//將對(duì)象轉(zhuǎn)換成json格式String str = mapper.writeValueAsString(list);//由于@RequestMapping注解,這里會(huì)將str轉(zhuǎn)成json格式返回;十分方便return str; }運(yùn)行測(cè)試,成功將所有對(duì)象的信息都以json的形式顯示出來(lái)
10、輸出日期對(duì)象
增加一個(gè)新的方法,測(cè)試日期對(duì)象的輸出@RequestMapping(value = "/j3") public String json3() throws JsonProcessingException {//創(chuàng)建jackson的對(duì)象映射器,用來(lái)解析數(shù)據(jù)ObjectMapper mapper = new ObjectMapper();//創(chuàng)建一個(gè)日期對(duì)象Date date = new Date();//將對(duì)象轉(zhuǎn)換為json格式String str = mapper.writeValueAsString(date);//ObjectMapper對(duì)時(shí)間解析后的默認(rèn)格式為:Timestamp(時(shí)間戳)return str; }運(yùn)行測(cè)試,訪問(wèn)http://localhost:8080/j3,手動(dòng)刷新,可以看到這個(gè)數(shù)字增長(zhǎng)很快
- 默認(rèn)日期格式會(huì)變成一個(gè)數(shù)字,是1970年1月1日到當(dāng)前日期的毫秒數(shù)!
- Jackson 默認(rèn)是會(huì)把時(shí)間轉(zhuǎn)成timestamps形式
如果我們不想以時(shí)間戳的方式顯示呢?
方式一:我們新增一個(gè)方法,自定義日期的格式
@RequestMapping(value = "/j4") public String json4() throws JsonProcessingException {//創(chuàng)建jackson的對(duì)象映射器,用來(lái)解析數(shù)據(jù)ObjectMapper mapper = new ObjectMapper();//創(chuàng)建一個(gè)日期對(duì)象Date date = new Date();//自定義日期格式SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yy-mm-dd hh:mm:ss");//將對(duì)象轉(zhuǎn)換為json格式String str = mapper.writeValueAsString(simpleDateFormat.format(date));return str; }運(yùn)行測(cè)試:訪問(wèn)http://localhost:8080/j4,成功按我們規(guī)定的格式輸出
方式二:取消timestamps形式 , 自定義時(shí)間格式
@RequestMapping(value = "/j5") public String json5() throws JsonProcessingException {//創(chuàng)建jackson的對(duì)象映射器,用來(lái)解析數(shù)據(jù)ObjectMapper mapper = new ObjectMapper();//不使用時(shí)間戳的方式mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);//自定義日期格式SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yy-mm-dd hh:mm:ss");//指定日期格式mapper.setDateFormat(simpleDateFormat);//創(chuàng)建一個(gè)日期對(duì)象Date date = new Date();//將對(duì)象轉(zhuǎn)換為json格式String str = mapper.writeValueAsString(date);return str; }運(yùn)行測(cè)試:訪問(wèn)http://localhost:8080/j5,同樣成功按我們規(guī)定的格式輸出
6. 使用FastJson進(jìn)行數(shù)據(jù)交互
fastjson.jar是阿里開(kāi)發(fā)的一款專(zhuān)門(mén)Java處理JSON開(kāi)發(fā)的包- Fastjson 是一個(gè) Java 庫(kù),可以將 Java 對(duì)象轉(zhuǎn)換為 JSON 格式,當(dāng)然它也可以將 JSON 字符串轉(zhuǎn)換為 Java 對(duì)象。
- Fastjson 可以操作任何 Java 對(duì)象,即使是一些預(yù)先存在的沒(méi)有源碼的對(duì)象。
菜鳥(niǎo)教程:https://www.runoob.com/w3cnote/fastjson-intro.html
Fastjson 源碼地址:https://github.com/alibaba/fastjson
Fastjson 中文 Wiki:https://github.com/alibaba/fastjson/wiki/Quick-Start-CN
接下來(lái)我們簡(jiǎn)單介紹一下SpringMVC中fastjson的使用1. 導(dǎo)入依賴(lài)依賴(lài)
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson --> <dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.73</version> </dependency>2. 三個(gè)主要的類(lèi)
JSONObject
代表 json對(duì)象- JSONObject實(shí)現(xiàn)了Map接口, 猜想 JSONObject底層操作是由Map實(shí)現(xiàn)的。
- JSONObject對(duì)應(yīng)json對(duì)象,通過(guò)各種形式的get()方法可以獲取json對(duì)象中的數(shù)據(jù),也可利用諸如size(),isEmpty()等方法獲取"鍵:值"對(duì)的個(gè)數(shù)和判斷是否為空。其本質(zhì)是通過(guò)實(shí)現(xiàn)Map接口并調(diào)用接口中的方法完成的。
JSONArray
代表 json對(duì)象數(shù)組- 內(nèi)部是有List接口中的方法來(lái)完成操作的。
JSON
代表 JSONObject 和 JSONArray 的轉(zhuǎn)化- JSON類(lèi)源碼分析與使用
- 仔細(xì)觀察這些方法,主要是實(shí)現(xiàn)json對(duì)象,json對(duì)象數(shù)組,javabean對(duì)象,json字符串之間的相互轉(zhuǎn)化。
3. 代碼測(cè)試
新建一個(gè)方法,利用fastjson的方法返回json字符串:@RequestMapping(value = "/j6") public String json6() throws JsonProcessingException {//創(chuàng)建容器List<User> list = new ArrayList<User>();//創(chuàng)建多個(gè)對(duì)象User user1 = new User("zsr1", 20, "男");User user2 = new User("zsr2", 20, "男");User user3 = new User("zsr3", 20, "男");User user4 = new User("zsr4", 20, "男");User user5 = new User("zsr5", 20, "男");//將所有對(duì)象存入容器list.add(user1);list.add(user2);list.add(user3);list.add(user4);list.add(user5);return JSON.toJSONString(list); }運(yùn)行測(cè)試:同樣正確顯示了結(jié)果
4. 常用方法測(cè)試代碼
這種工具類(lèi),我們只需知道了解即可,在使用的時(shí)候在根據(jù)具體的業(yè)務(wù)去找對(duì)應(yīng)的實(shí)現(xiàn)即可接下來(lái)是幾種常用的方法(更多的方法在具體的業(yè)務(wù)時(shí)查找使用即可)
public static void main(String[] args) {//創(chuàng)建容器List<User> list = new ArrayList<User>();//創(chuàng)建多個(gè)對(duì)象User user1 = new User("zsr1", 20, "男");User user2 = new User("zsr2", 20, "男");User user3 = new User("zsr3", 20, "男");User user4 = new User("zsr4", 20, "男");User user5 = new User("zsr5", 20, "男");//將所有對(duì)象存入容器list.add(user1);list.add(user2);list.add(user3);list.add(user4);list.add(user5);//常用代碼測(cè)試System.out.println("Java對(duì)象集合轉(zhuǎn)化為JSON字符串: "+ JSON.toJSONString(list));System.out.println("Java對(duì)象user1轉(zhuǎn)化為JSON字符串: "+ JSON.toJSONString(user1));System.out.println("JSON字符串轉(zhuǎn)化為Java對(duì)象user1: "+ JSON.parseObject(JSON.toJSONString(user1), User.class));System.out.println("Java對(duì)象user1轉(zhuǎn)化為JSON對(duì)象: "+ JSON.toJSON(user1));System.out.println("JSON對(duì)象轉(zhuǎn)化為Java對(duì)象user1: "+ JSON.toJavaObject((JSON) JSON.toJSON(user1), User.class)); }運(yùn)行結(jié)果:
總結(jié)
以上是生活随笔為你收集整理的mvc json 乱码_你了解JSON吗?——Jackson、FastJson在SpringMVC中的简单使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: e贷通办理流程
- 下一篇: 前端判断是否安装桌面应用_前端开发人员的