文章來源地址http://www.zghlxwxcb.cn/news/detail-685800.html
??? ???JSON 概況以及 JAVA 基本操作 JSON 數(shù)據(jù)的方式
一、JSON 數(shù)據(jù)的交互處理
1、為什么要使用 JSON
??? ???因?yàn)楝F(xiàn)在的項(xiàng)目大多數(shù)都是前后端分離的項(xiàng)目,前端和后端都獨(dú)立開發(fā)和部署。
??? ???由后端提供接口,前端從接口獲取數(shù)據(jù),將數(shù)據(jù)渲染到頁面上。前后端數(shù)據(jù)傳輸?shù)母袷骄褪?JSON!
2、JSON 和 JavaScript 之間的關(guān)系
-
JSON 和 JavaScript 的關(guān)系: JSON 是 JavaScript 對象的字符串表示法,它使用文本表示一個 JS 對象的信息,本質(zhì)是一個字符串。
var obj = {a: 'Hello', b: 'World'}; //這是一個對象,注意鍵名也是可以使用引號包裹的 var json = '{"a": "Hello", "b": "World"}'; //這是一個 JSON 字符串,本質(zhì)是一個字符串
3、前端操作 JSON
-
代碼示例
-
創(chuàng)建一個 HTML 文件,在 < head > 中添加 < script > 標(biāo)簽編寫示例代碼
-
注:< script > 必須成對出現(xiàn),否則不生效
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script type="application/javascript"> // 創(chuàng)建對象,定義屬性并賦值 var user = { name:"姚青", age:24, sex:"男" } // 打印 user 對象 console.log(user); </script> </head> <body> </body> </html>
-
通過瀏覽器打開該文件,可以看到打印的對象(對象是可以打開的,字符串不行)
-
-
3.1 JavaScript 對象與 JSON 字符串之間的相互轉(zhuǎn)換
-
在 JavaScript 中默認(rèn)提供了一個 JSON 的類,這個類中提供了兩個方法,可以實(shí)現(xiàn) JSON 和 JavaScript 的相互轉(zhuǎn)換
-
parse() :將 JSON 字符串轉(zhuǎn)換為 JavaScript 對象
-
stringify() :將 JavaScript 對象轉(zhuǎn)換為 JSON 字符串
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script type="application/javascript"> var user = { name:"姚青", age:24, sex:"男" } // 打印正常對象 console.log(user); // 打印對象轉(zhuǎn)換后的JSON var json = JSON.stringify(user); console.log(json); // 打印JSON轉(zhuǎn)換的JavaScript 對象 var JavaScript = JSON.parse(json); console.log(JavaScript); </script> </head> <body> </body> </html>
-
執(zhí)行結(jié)果
-
4、JAVA 操作 JSON
4.1 Json 的解析工具(Gson、FastJson、Jackson)
-
Gson:谷歌公司推出的Json解析工具
-
Gson 主要有 toJson 與 fromJson 兩個轉(zhuǎn)換方法,通過這兩個方法實(shí)現(xiàn) Json 與 Java 對象之間的相互轉(zhuǎn)換
-
Gson詳解用法
-
-
FastJson:阿里巴巴推出的Json解析工具
-
FastJson 在復(fù)雜類型的 Bean 轉(zhuǎn)換 Json 上會出現(xiàn)一些問題,可能會出現(xiàn)引用的類型,導(dǎo)致 Json 轉(zhuǎn)換出錯,需要制定引用。
-
FastJson 采用獨(dú)創(chuàng)的算法,將解析的速度提升到極致,超過所有 json 庫。
- FastJson 依賴包,導(dǎo)入 pom.xml 中即可使用
<dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.60</version> </dependency>
- FastJson 依賴包,導(dǎo)入 pom.xml 中即可使用
-
FastJson的使用方法
-
-
Jackson:Jackson 是比較著名的一個解析工具
-
Jackson 是當(dāng)前用的比較廣泛的,用來序列化和反序列化 json 的 Java 的開源框架
-
Jackson 社 區(qū)相對比較活躍,更新速度也比較快,是最流行的 json 解析器之一
-
Jackson 依賴包,導(dǎo)入 pom.xml 中即可使用
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.9.8</version> </dependency>
-
ObjectMapper 類
-
ObjectMapper 類(com.fasterxml.jackson.databind.ObjectMapper)是 Jackson 的主要類,它可以幫助我們快速的進(jìn)行各個類型和Json類型的相互轉(zhuǎn)換。
- public String writeValueAsString(Object value): 將 Java 對象轉(zhuǎn)換成 JSON
-
ObjectMapper 類詳解
-
-
-
-
區(qū)別
- FastJson的性能優(yōu)于Gson,但是處理復(fù)雜類型時可能會出現(xiàn)一些錯誤,到現(xiàn)在還有很多BUG沒修。
- Gson的功能非常的齊全。
- Jakson性能也非常出色,但是將核心功能拆分成三個模塊,有Jar依賴。
注:Java工具千千萬,處理 json 的工具有很多,大多數(shù)都是可以完成數(shù)據(jù)轉(zhuǎn)換這一過程的,只是不同的工具所呈現(xiàn)的效果不一。所以,選擇適合工具即可。
4.2 @ResponseBody 注解、@RestController 注解
-
@ResponseBody 注解
-
1、概念
-
@ResponseBody 注解,使用在控制層(controller)的方法上。
-
-
2、作用
-
??? ???將方法的返回值,以特定的格式寫入到response的body區(qū)域,進(jìn)而將數(shù)據(jù)返回給客戶端。
??? ???當(dāng)方法上面沒有寫ResponseBody,底層會將方法的返回值封裝為ModelAndView對象。
??? ??? 如果返回值是字符串,那么直接將字符串寫到客戶端;如果是一個對象,會將對象轉(zhuǎn)化為 json 串,然后返回給客戶端。
-
-
-
@RestController 注解
-
1、概念
-
@ResponseBody 注解,使用在控制層(controller)的類上。
-
-
2、作用
-
??? ??? @RestController 的作用等同于 @Controller + @ResponseBody。并且改注解的作用域是整個類,當(dāng)類被該注解標(biāo)記時,類中所有的方法都會返回 JSON ,不用再每一個方法上都添加 @ResponseBody了。
-
-
注:當(dāng)使用 @ResponseBody 注解和 @RestController 注解時,就不會去走視圖解析器了,直接返回一個字符串,
4.3 java 中操作 JSON 的方式:返回值不做處理,返回默認(rèn) json
-
代碼示例:
-
配置 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.注冊servlet--> <servlet> <servlet-name>SpringMVC</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!--通過初始化參數(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> <!-- 啟動順序,數(shù)字越小,啟動越早 --> <load-on-startup>1</load-on-startup> </servlet> <!--所有請求都會被springmvc攔截 --> <servlet-mapping> <servlet-name>SpringMVC</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <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>
-
Spring 配置文件
<?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/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd"> <!-- 自動掃描指定的包,下面所有注解類交給IOC容器管理 --> <context:component-scan base-package="com.sys.controller"/> </beans>
-
-
創(chuàng)建實(shí)體類
@Data public class User { private String id; private String name; private int age; private String sex; private String pass; public User(String id, String name, int age, String sex, String pass) { this.id = id; this.name = name; this.age = age; this.sex = sex; this.pass = pass; } }
-
創(chuàng)建 Controller
@Controller public class UserController { @RequestMapping("/json") @ResponseBody public String getUserJson() { return new User("1", "姚青", 999, "男", "123456").toString(); } }
-
啟動 tomcat,發(fā)現(xiàn)返回的 Json 中數(shù)字類型返回正常,中文亂碼
-
4.3.1 配置亂碼過濾器(亂碼問題統(tǒng)一解決)
-
在 Spring 配置文件中配置亂碼過濾器
<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>
-
重新發(fā)布項(xiàng)目
4.4 java 中操作 JSON 的方式: Jackson
-
代碼示例1:將Java對象轉(zhuǎn)換成 JSON
-
創(chuàng)建 controller,引入 Jackson 工具依賴其余內(nèi)容不變
@RestController public class JacksonController { @RequestMapping("/getJackson") public String getJackson(){ User user = new User("1", "姚青", 999, "男", "123456"); //創(chuàng)建 jackson 對象映射器,用來解析數(shù)據(jù) ObjectMapper objectMapper = new ObjectMapper(); String str; try { // 將 java 對象轉(zhuǎn)換成 json str = objectMapper.writeValueAsString(user); } catch (JsonProcessingException e) { throw new RuntimeException(e); } return str; } }
-
啟動 tomcat,查看結(jié)果
-
-
代碼示例2:返回集合,通過 Jackson 將集合轉(zhuǎn)換成 JSON
-
在 JacksonController 中新增接口
@RestController public class JacksonController { @RequestMapping("/getJackson") public String getJackson() { User user = new User("1", "姚青", 999, "男", "123456"); //創(chuàng)建 jackson 對象映射器,用來解析數(shù)據(jù) ObjectMapper objectMapper = new ObjectMapper(); String str; try { // 將 java 對象轉(zhuǎn)換成 json str = objectMapper.writeValueAsString(user); } catch (JsonProcessingException e) { throw new RuntimeException(e); } return str; } @RequestMapping("/getJackson2") public String getJackson2() { User user = new User("1", "姚青", 999, "男", "123456"); User user2 = new User("2", "姚青2", 998, "男", "123456"); User user3 = new User("3", "姚青3", 997, "男", "123456"); User user4 = new User("4", "姚青4", 996, "男", "123456"); List<User> list = new ArrayList<>(); Collections.addAll(list, user, user2, user3, user4); //創(chuàng)建 jackson 對象映射器,用來解析數(shù)據(jù) ObjectMapper objectMapper = new ObjectMapper(); String str; try { // 將 java 對象轉(zhuǎn)換成 json str = objectMapper.writeValueAsString(list); } catch (JsonProcessingException e) { throw new RuntimeException(e); } return str; } }
-
運(yùn)行結(jié)果
文章來源:http://www.zghlxwxcb.cn/news/detail-685800.html
-
到了這里,關(guān)于六、Json 數(shù)據(jù)的交互處理的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!