1. 程式人生 > 實用技巧 >SpringMVC(2):JSON

SpringMVC(2):JSON

一,JSON 介紹

JSON (JavaScript Object Notation, JS 物件簡譜) 是一種輕量級的資料交換格式。易於人閱讀和編寫,同時也易於機器解析和生成,並有效地提升網路傳輸效率

二,JSON 語法

1,JSON 語法規則

在 JS 語言中,一切都是物件。因此,任何支援的型別都可以通過 JSON 來表示,例如字串、數字、物件、陣列等。但是物件和陣列是比較特殊且常用的兩種型別

  • 物件表示為鍵值對

  • 資料由逗號分隔

  • 花括號儲存物件

  • 方括號儲存陣列

2,JSON 鍵/值對

JSON 鍵值對是用來儲存 JS 物件的一種方式,和 JS 物件的寫法也大同小異,鍵/值對組合中的鍵名寫在前面並用雙引號 " " 包裹,使用冒號 : 分隔,然後緊接著值

1 1 { "firstName" : "Json" } 等價於這條 JavaScript 語句:{ firstName : "Json" }

3,JSON 與 JS 物件的關係

很多人搞不清楚 JSON 和 JS物件的關係,甚至連誰是誰都不清楚。其實可以這麼理解:JSON 是 JS 物件的字串表示法,它使用文字表示一個 JS 物件的資訊,本質是一個字串

1 var obj = {a: 'Hello', b: 'World'}; //這是一個物件,注意鍵名也是可以使用引號包裹的
2 
3 var json = '{"a": "Hello", "b": "World"}'; //這是一個 JSON 字串,本質是一個字串

4,JSON 和 JS 物件互轉

要實現從JSON字串轉換為JS物件,使用 JSON.parse() 方法

1 var obj = JSON.parse('{"a": "Hello", "b": "World"}'); 2 //結果是 {a: 'Hello', b: 'World'}

要實現從JS物件轉換為JSON字串,使用 JSON.stringify() 方法

1 var json = JSON.stringify({a: 'Hello', b: 'World'}); 2 //結果是 '{"a": "Hello", "b": "World"}'

三,使用Controller實現返回JSON資料

1,搭建實驗環境

配置springmvc-servlet.xml【注意:為了決解亂碼問題,我們在配置檔案中匯入相關程式碼】

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4        xmlns:context="http://www.springframework.org/schema/context"
 5        xmlns:mvc="http://www.springframework.org/schema/mvc"
 6        xsi:schemaLocation="http://www.springframework.org/schema/beans
 7         http://www.springframework.org/schema/beans/spring-beans.xsd
 8         http://www.springframework.org/schema/context
 9         http://www.springframework.org/schema/context/spring-context.xsd
10         http://www.springframework.org/schema/mvc
11         http://www.springframework.org/schema/mvc/spring-mvc.xsd">
12 
13     <context:component-scan base-package="com.shandx.controller"/>
14     <mvc:default-servlet-handler/>
15     <mvc:annotation-driven>
16     
17         <!--JSON格式亂碼處理方式-->
18         <mvc:message-converters register-defaults="true">
19             <bean class="org.springframework.http.converter.StringHttpMessageConverter">
20                 <constructor-arg value="UTF-8"/>
21             </bean>
22             <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
23                 <property name="objectMapper">
24                     <bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean">
25                         <property name="failOnEmptyBeans" value="false"/>
26                     </bean>
27                 </property>
28             </bean>
29         </mvc:message-converters>
30     </mvc:annotation-driven>
31     <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="InternalResourceViewResolver">
32         <property name="prefix" value="/WEB-INF/jsp/"/>
33         <property name="suffix" value=".jsp"/>
34     </bean>
35     
36 </beans>

配置web.xml

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 3          xmlns="http://java.sun.com/xml/ns/javaee"
 4          xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
 5          http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
 6          id="WebApp_ID" version="3.0">
 7 
 8   <!--1.註冊DispatcherServlet-->
 9   <servlet>
10     <servlet-name>SpringMVC</servlet-name>
11     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
12     <!--2.關聯SpringMVC配置檔案-->
13     <init-param>
14       <param-name>contextConfigLocation</param-name>
15       <param-value>classpath:springmvc-servlet.xml</param-value>
16     </init-param>
17 
18     <!--3.這個東西要和伺服器一起啟動-->
19     <load-on-startup>1</load-on-startup>
20   </servlet>
21 
22   <servlet-mapping>
23     <servlet-name>SpringMVC</servlet-name>
24     <url-pattern>/</url-pattern>
25   </servlet-mapping>
26 
27 </web-app>

Jackson是目前比較好的json解析工具了,我們這裡使用Jackson,使用它需要匯入它的jar包

1 <dependency>
2       <groupId>com.fasterxml.jackson.core</groupId>
3       <artifactId>jackson-databind</artifactId>
4       <version>2.9.8</version>
5 </dependency>

2,編寫User實體類

User實體類

 1 public class User {
 2 
 3     private String name;
 4     private int age;
 5     private String sex;
 6 
 7     public User() {
 8     }
 9 
10     public User(String name, int age, String sex) {
11         this.name = name;
12         this.age = age;
13         this.sex = sex;
14     }
15 
16     public String getName() {
17         return name;
18     }
19 
20     public void setName(String name) {
21         this.name = name;
22     }
23 
24     public int getAge() {
25         return age;
26     }
27 
28     public void setAge(int age) {
29         this.age = age;
30     }
31 
32     public String getSex() {
33         return sex;
34     }
35 
36     public void setSex(String sex) {
37         this.sex = sex;
38     }
39 
40     @Override
41     public String toString() {
42         return "User{" +
43                 "name='" + name + '\'' +
44                 ", age=" + age +
45                 ", sex='" + sex + '\'' +
46                 '}';
47     }
48 
49 }

3,測試Controller

1,編寫Controller時我們需要兩個新東西,一個是@ResponseBody,一個是ObjectMapper物件

 1 @Controller
 2 public class UserController {
 3 
 4     @RequestMapping("/json1")
 5     @ResponseBody
 6     public String getJson1() throws JsonProcessingException {
 7 
 8         ObjectMapper mapper=new ObjectMapper();
 9         User user = new User("鋼鐵俠",52,"男");
10         String s = mapper.writeValueAsString(user);
11 
12         return s;
13     }
14 }

執行結果

2,JSON還可以列印集合

 1 @Controller
 2 public class UserController {
 3 
 4     @RequestMapping("/json2")
 5     @ResponseBody
 6     public String getJson2() throws JsonProcessingException {
 7 
 8         ObjectMapper mapper=new ObjectMapper();
 9         List<User> list=new ArrayList<>();
10         User user1 = new User("鋼鐵俠",1,"男");
11         User user2 = new User("蜘蛛俠",2,"男");
12         User user3 = new User("閃電俠",3,"男");
13         list.add(user1);
14         list.add(user2);
15         list.add(user3);
16         String s = mapper.writeValueAsString(list);
17 
18         return s;
19     }
20 }

執行結果

3,建立一個時間日期的物件

 1 @Controller
 2 public class UserController {
 3 
 4     @RequestMapping("/json3")
 5     @ResponseBody
 6     public String getJson3() throws JsonProcessingException {
 7 
 8         ObjectMapper mapper = new ObjectMapper();
 9         //1.如何讓他不返回時間戳!所以我們要關閉它的時間戳功能
10         mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,false);
11         //2.時間格式化問題!自定日期格式物件;
12         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
13         //3.讓mapper指定時間日期格式為simpleDateFormat;
14         mapper.setDateFormat(sdf);
15 
16         Date date = new Date();
17         String s = mapper.writeValueAsString(date);
18 
19         return s;
20     }
21  }

執行結果

4,我們也可以把上面的程式碼封裝成一個工具類

 1 public class JsonUtils {
 2 
 3     public static String getJson(Object object) {
 4 
 5         return getJson(object, "yyyy-MM-dd HH:mm:ss");
 6     }
 7 
 8 
 9     public static String getJson(Object object, String dateFormat) {
10         ObjectMapper mapper = new ObjectMapper();
11         mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
12         SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
13         mapper.setDateFormat(sdf);
14 
15         try {
16             String s = mapper.writeValueAsString(object);
17             return s;
18         } catch (JsonProcessingException e) {
19             e.printStackTrace();
20         }
21         return null;
22     }
23 }

再次建立時間日期的物件時,我們只需要調方法即可

 1 @Controller
 2 public class UserController {
 3 
 4     @RequestMapping("/json4")
 5     @ResponseBody
 6     public String getJson4() throws JsonProcessingException {
 7 
 8         return JsonUtils.getJson(new Date());
 9 
10     }
11  }