JSON
JSON(JavaScript Object Notation, JS 對象簡譜) 是一種輕量級的數(shù)據(jù)交換格式。它基于 ECMAScript (歐洲計算機協(xié)會制定的js規(guī)范)的一個子集,采用完全獨立于編程語言的文本格式來存儲和表示數(shù)據(jù)概说。簡潔和清晰的層次結(jié)構(gòu)使得 JSON 成為理想的數(shù)據(jù)交換語言。 易于人閱讀和編寫竖哩,同時也易于機器解析和生成,并有效地提升網(wǎng)絡傳輸效率脊僚。
- JSON(JavaScript Object Notation, JS 對象標記) 是一種輕量級的數(shù)據(jù)交換格式相叁,目前使用特別廣泛。
- 采用完全獨立于編程語言的文本格式來存儲和表示數(shù)據(jù)。
- 簡潔和清晰的層次結(jié)構(gòu)使得 JSON 成為理想的數(shù)據(jù)交換語言钝荡。
- 易于人閱讀和編寫,同時也易于機器解析和生成舶衬,并有效地提升網(wǎng)絡傳輸效率埠通。
在 JavaScript 語言中,一切都是對象逛犹。因此端辱,任何JavaScript 支持的類型都可以通過 JSON 來表示,例如字符串虽画、數(shù)字舞蔽、對象、數(shù)組等码撰∩粒看看他的要求和語法格式:
- 對象表示為鍵值對,數(shù)據(jù)由逗號分隔
- 花括號保存對象
- 方括號保存數(shù)組
JSON 鍵值對是用來保存 JavaScript 對象的一種方式脖岛,和 JavaScript 對象的寫法也大同小異朵栖,鍵/值對組合中的鍵名寫在前面并用雙引號 "" 包裹,使用冒號 : 分隔柴梆,然后緊接著值
JSON 與 JS 對象的關(guān)系
很多人搞不清楚 JSON 和 JS 對象的關(guān)系陨溅,甚至連誰是誰都不清楚。其實绍在,可以這么理解:
JSON 是 JS 對象的字符串表示法门扇,它使用文本表示一個 JS 對象的信息,本質(zhì)是一個字符串偿渡。
JSON 和 JS 對象互轉(zhuǎn)
要實現(xiàn)從JSON字符串轉(zhuǎn)換為JS對象臼寄,使用 JSON.parse() 方法
要實現(xiàn)從JS對象轉(zhuǎn)換為JSON字符串,使用 JSON.stringify() 方法
Jackson
{% note success %}
環(huán)境搭建
{% endnote %}
建立一個SpringMvc項目溜宽。導入相關(guān)的依賴和jackson依賴
<!--jackson-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.8</version>
</dependency>
<!--Spring-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
</dependency>
<!--Servlet - JSP -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
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/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.kylin.controller"/>
<!---->
<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>
<!-- 視圖解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
id="internalResourceViewResolver">
<!-- 前綴 -->
<property name="prefix" value="/WEB-INF/jsp/"/>
<!-- 后綴 -->
<property name="suffix" value=".jsp"/>
</bean>
<!-- 設置靜態(tài)資源不過濾 -->
<mvc:resources location="/static/" mapping="/static/**" />
</beans>
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配置文件的位置,進行關(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>
創(chuàng)建一個pojo包,User類涡扼。(構(gòu)造器稼跳,getter和setter方法,重寫toString)
public class User {
private String name;
private int age;
private String sex;
}
創(chuàng)建一個controller類吃沪,編寫一個UserController類汤善。
<mark>注意:由于使用的是SpringMVC。正常返回他會走視圖解析器,而json需要返回的是一個字符串红淡。所有我們使用ResponseBody注解不狮。但是由于SpringMVC的@ResponseBody注解集成Jackson。返回對象就會自動轉(zhuǎn)換成Json字符串在旱。</mark>
首先創(chuàng)建一個jackson的對象映射器摇零,用來解析數(shù)據(jù)
ObjectMapper mapper = new ObjectMapper();
使用writeValueAsString(Object)轉(zhuǎn)換成Json字符串
mapper.writeValueAsString(Object);
直接返回User對象
我們發(fā)現(xiàn)使用Jackson轉(zhuǎn)換對象為json字符串出現(xiàn)了亂碼我們可以在RequestMapping注解中的produces配置編碼格式produces = "application/json;charset=utf-8"
解決了亂碼問題!
{% note success %}
亂碼統(tǒng)一解決
{% endnote %}
但是沒錯這樣配置還是有點麻煩桶蝎。我么可以通過配置SpringMVC的配置文件配置mvc:annotation-driven
中的mvc:message-converters
在編寫一個請求驻仅,將一個list對象轉(zhuǎn)換為json字符串
此時我們沒有配置RequestMapping注解中的produces配置編碼格式。也不會出現(xiàn)亂碼問題了
{% note success %}
輸出時間對象
{% endnote %}
- 默認日期格式會變成一個數(shù)字登渣,是1970年1月1日到當前日期的毫秒數(shù)噪服!
- Jackson 默認是會把時間轉(zhuǎn)成timestamps形式
解決方案:取消timestamps形式 , 自定義時間格式mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
輸出指定格式日期
{% note success %}
抽取為工具類
{% endnote %}
將日期格式抽取為一個工具類胜茧。創(chuàng)建一個utils包粘优,編寫一個JsonUtils類
public class JsonUtils {
public static String getJson(Date date){
return getJson(date,"yyyy-MM-dd HH:mm:ss");
}
public static String getJson(Date date, String pattern) {
ObjectMapper mapper = new ObjectMapper();
//不使用時間戳的方式
mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
//自定義日期格式對象
SimpleDateFormat sdf = new SimpleDateFormat(pattern);
//指定日期格式
mapper.setDateFormat(sdf);
String str = null;
try {
str = mapper.writeValueAsString(date);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
return str;
}
}
成功!
FastJson
fastjson.jar是阿里開發(fā)的一款專門用于Java開發(fā)的包,可以方便的實現(xiàn)json對象與JavaBean對象的轉(zhuǎn)換呻顽,實現(xiàn)JavaBean對象與json字符串的轉(zhuǎn)換敬飒,實現(xiàn)json對象與json字符串的轉(zhuǎn)換。實現(xiàn)json的轉(zhuǎn)換方法很多芬位,最后的實現(xiàn)結(jié)果都是一樣的无拗。
導入fastjson的pom依賴
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.60</version>
</dependency>
- 提供服務器端、安卓客戶端兩種解析工具昧碉,性能表現(xiàn)較好英染。
- 提供了 toJSONString() 和 parseObject() 方法來將 Java 對象與 JSON 相互轉(zhuǎn)換。調(diào)用toJSONString方 法即可將對象轉(zhuǎn)換成 JSON 字符串被饿,parseObject 方法則反過來將 JSON 字符串轉(zhuǎn)換成對象四康。
- 允許轉(zhuǎn)換預先存在的無法修改的對象(只有class、無源代碼)狭握。
- Java泛型的廣泛支持闪金。
- 允許對象的自定義表示、允許自定義序列化類论颅。
- 支持任意復雜對象(具有深厚的繼承層次和廣泛使用的泛型類型)哎垦。
編寫一個FastJsonDemo類進行測試
public class FastJsonDemo {
public static void main(String[] args) {
//創(chuàng)建一個對象
User user1 = new User("kylin1號", 3, "男");
User user2 = new User("kylin2號", 3, "男");
User user3 = new User("kylin3號", 3, "男");
User user4 = new User("kylin4號", 3, "男");
List<User> list = new ArrayList<User>();
list.add(user1);
list.add(user2);
list.add(user3);
list.add(user4);
System.out.println("*******Java對象 轉(zhuǎn) JSON字符串*******");
String str1 = JSON.toJSONString(list);
System.out.println("JSON.toJSONString(list)==>" + str1);
String str2 = JSON.toJSONString(user1);
System.out.println("JSON.toJSONString(user1)==>" + str2);
System.out.println("\n****** JSON字符串 轉(zhuǎn) Java對象*******");
User jp_user1 = JSON.parseObject(str2, User.class);
System.out.println("JSON.parseObject(str2,User.class)==>" + jp_user1);
System.out.println("\n****** Java對象 轉(zhuǎn) JSON對象 ******");
JSONObject jsonObject1 = (JSONObject) JSON.toJSON(user2);
System.out.println("(JSONObject) JSON.toJSON(user2)==>" + jsonObject1.getString("name"));
System.out.println("\n****** JSON對象 轉(zhuǎn) Java對象 ******");
User to_java_user = JSON.toJavaObject(jsonObject1, User.class);
System.out.println("JSON.toJavaObject(jsonObject1, User.class)==>" + to_java_user);
}
}