Spring mvc Json處理實現(xiàn)流程代碼實例
接收J(rèn)SON
瀏覽器傳來的參數(shù),可以是 key/value 形式的,也可以是一個 JSON 字符串。在 Jsp/Servlet 中,我們接收 key/value 形式的參數(shù),一般是通過 getParameter 方法。如果客戶端商戶傳的是 JSON 數(shù)據(jù),我們可以通過如下格式進(jìn)行解析:
@RequestMapping('/addbook2')@ResponseBodypublic void addBook2(HttpServletRequest req) throws IOException { ObjectMapper om = new ObjectMapper(); Book book = om.readValue(req.getInputStream(), Book.class); System.out.println(book);}
但是這種解析方式有點麻煩,在 SpringMVC 中,我們可以通過一個注解來快速的將一個 JSON 字符串轉(zhuǎn)為一個對象:
@RequestMapping('/addbook3')@ResponseBodypublic void addBook3(@RequestBody Book book) { System.out.println(book);}
這樣就可以直接收到前端傳來的 JSON 字符串了。這也是 HttpMessageConverter 提供的第二個功能。
返回JSON
目前主流的 JON 處理工具主要有三種:
jackson
jackson 是一個使用比較多,時間也比較長的 JSON 處理工具,在 SpringMVC 中使用 jackson ,只需要添加 jackson 的依賴即可:
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.10.1</version></dependency>
依賴添加成功后,凡是在接口中直接返回的對象,集合等等,都會自動轉(zhuǎn)為 JSON。如下:
public class Book { private Integer id; private String name; private String author;...}@RequestMapping('/book')@ResponseBodypublic Book getBookById() { Book book = new Book(); book.setId(1); book.setName('三國演義'); book.setAuthor('羅貫中'); return book;}
這里返回一個對象,但是在前端接收到的則是一個 JSON 字符串,這個對象會通過 HttpMessageConverter 自動轉(zhuǎn)為 JSON 字符串。
如果想返回一個 JSON 數(shù)組,寫法如下:
@RequestMapping('/books')@ResponseBodypublic List<Book> getAllBooks() { List<Book> list = new ArrayList<Book>(); for (int i = 0; i < 10; i++) { Book book = new Book(); book.setId(i); book.setName('三國演義:' + i); book.setAuthor('羅貫中:' + i); list.add(book); } return list;}
converter 【肯喔特】轉(zhuǎn)變器
添加了 jackson ,就能夠自動返回 JSON,這個依賴于一個名為 HttpMessageConverter 的類,這本身是一個接口,從名字上就可以看出,它的作用是 Http 消息轉(zhuǎn)換器,既然是消息轉(zhuǎn)換器,它提供了兩方面的功能:
將返回的對象轉(zhuǎn)為 JSON
將前端提交上來的 JSON 轉(zhuǎn)為對象
但是,HttpMessageConverter 只是一個接口,由各個 JSON 工具提供相應(yīng)的實現(xiàn),在 jackson 中,實現(xiàn)的名字叫做 MappingJackson2HttpMessageConverter,而這個東西的初始化,則由 SpringMVC 來完成。除非自己有一些自定義配置的需求,否則一般來說不需要自己提供
MappingJackson2HttpMessageConverter。
舉一個簡單的應(yīng)用場景,例如每一本書,都有一個出版日期,修改 Book 類如下:
public class Book { private Integer id; private String name; private String author; private Date publish;...}
然后在構(gòu)造 Book 時添加日期屬性:
@RequestMapping('/book')@ResponseBodypublic Book getBookById() { Book book = new Book(); book.setId(1); book.setName('三國演義'); book.setAuthor('羅貫中'); book.setPublish(new Date()); return book;}
訪問 /book 接口,返回的 json 格式如下:
如果我們想自己定制返回日期的格式,簡單的辦法,可以通過添加注解來實現(xiàn):
public class Book { private Integer id; private String name; private String author; @JsonFormat(pattern = 'yyyy-MM-dd',timezone = 'Asia/Shanghai') private Date publish;
注意這里一定要設(shè)置時區(qū)。
這樣,就可以定制返回的日期格式了。
但是,這種方式有一個弊端,這個注解可以加在屬性上,也可以加在類上,也就說,最大可以作用到一個類中的所有日期屬性上。如果項目中有很多實體類都需要做日期格式化,使用這種方式就比較麻煩了,這個時候,我們可以自己提供一個 jackson 的 HttpMesageConverter 實例,在這個實例中,自己去配置相關(guān)屬性,這里的配置將是一個全局配置。
在 SpringMVC 配置文件中,添加如下配置:
<mvc:annotation-driven> <mvc:message-converters> <ref bean='httpMessageConverter'/> </mvc:message-converters></mvc:annotation-driven><bean id='httpMessageConverter'> <property name='objectMapper'> <bean class='com.fasterxml.jackson.databind.ObjectMapper'> <property name='dateFormat'><bean class='java.text.SimpleDateFormat'> <constructor-arg name='pattern' value='yyyy-MM-dd HH:mm:ss'/></bean> </property> <property name='timeZone' value='Asia/Shanghai'/> </bean> </property></bean>
添加完成后,去掉 Book 實體類中日期格式化的注解,再進(jìn)行測試,結(jié)果如下:
gson
gson 是 Google 推出的一個 JSON 解析器,主要在 Android 開發(fā)中使用較多,不過,Web 開發(fā)中也是支持這個的,而且 SpringMVC 還針對 Gson 提供了相關(guān)的自動化配置,以致我們在項目中只要添加 gson 依賴,就可以直接使用 gson 來做 JSON 解析了。
<dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.8.6</version></dependency>
如果項目中,同時存在 jackson 和gson 的話,那么默認(rèn)使用的是 jackson,為什么呢?在org.springframework.http.converter.support.AllEncompassingFormHttpMessageConverter類的構(gòu)造方法中,加載順序就是先加載 jackson 的 HttpMessageConverter,后加載 gson 的 HttpMessageConverter。
加完依賴之后,就可以直接返回 JSON 字符串了。使用 Gson 時,如果想做自定義配置,則需要自定義 HttpMessageConverter。
<mvc:annotation-driven> <mvc:message-converters> <ref bean='httpMessageConverter'/> </mvc:message-converters></mvc:annotation-driven><bean id='httpMessageConverter'> <property name='gson'> <bean factory-bean='gsonBuilder' factory-method='create'/> </property></bean><bean id='gsonBuilder'> <property name='dateFormat' value='yyyy-MM-dd'/></bean>
fastjson 號稱最快的 JSON 解析器,但是也是這三個中 BUG 最多的一個。在 SpringMVC 并沒針對 fastjson 提供相應(yīng)的 HttpMessageConverter,所以,fastjson 在使用時,一定要自己手動配置 HttpMessageConverter(前面兩個如果沒有特殊需要,直接添加依賴就可以了)。
使用 fastjson,我們首先添加 fastjson 依賴:
<dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.60</version></dependency>
然后在 SpringMVC 的配置文件中配置 HttpMessageConverter:
<mvc:annotation-driven> <mvc:message-converters> <ref bean='httpMessageConverter'/> </mvc:message-converters></mvc:annotation-driven><bean id='httpMessageConverter'> <property name='fastJsonConfig'> <bean class='com.alibaba.fastjson.support.config.FastJsonConfig'> <property name='dateFormat' value='yyyy-MM-dd'/> </bean> </property></bean>
fastjson 默認(rèn)中文亂碼,添加如下配置解決:
<mvc:annotation-driven> <mvc:message-converters> <ref bean='httpMessageConverter'/> </mvc:message-converters></mvc:annotation-driven><bean id='httpMessageConverter'> <property name='fastJsonConfig'> <bean class='com.alibaba.fastjson.support.config.FastJsonConfig'> <property name='dateFormat' value='yyyy-MM-dd'/> </bean> </property> <property name='supportedMediaTypes'> <list> <value>application/json;charset=utf-8</value> </list> </property></bean>
在 SpringMVC 中,對 jackson 和 gson 都提供了相應(yīng)的支持,就是如果使用這兩個作為 JSON 轉(zhuǎn)換器,只需要添加對應(yīng)的依賴就可以了,返回的對象和返回的集合、Map 等都會自動轉(zhuǎn)為 JSON,但是,如果使用 fastjson,除了添加相應(yīng)的依賴之外,還需要自己手動配置 HttpMessageConverter 轉(zhuǎn)換器。其實前兩個也是使用 HttpMessageConverter 轉(zhuǎn)換器,但是是 SpringMVC 自動提供的,SpringMVC 沒有給 fastjson 提供相應(yīng)的轉(zhuǎn)換器。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。
相關(guān)文章:
1. asp(vbscript)中自定義函數(shù)的默認(rèn)參數(shù)實現(xiàn)代碼2. CSS3實例分享之多重背景的實現(xiàn)(Multiple backgrounds)3. XML入門的常見問題(四)4. 使用Spry輕松將XML數(shù)據(jù)顯示到HTML頁的方法5. 詳解瀏覽器的緩存機(jī)制6. ASP基礎(chǔ)知識VBScript基本元素講解7. XHTML 1.0:標(biāo)記新的開端8. XML解析錯誤:未組織好 的解決辦法9. php網(wǎng)絡(luò)安全中命令執(zhí)行漏洞的產(chǎn)生及本質(zhì)探究10. 利用CSS3新特性創(chuàng)建透明邊框三角
