1. 程式人生 > 其它 >SpringMVC學習13:什麼是JSON

SpringMVC學習13:什麼是JSON

SpringMVC學習13:什麼是JSON

  • 什麼是JSON:

    • JSON(javaScript Object Notation : js物件標記)是一種輕量級的資料交換格式,目前使用特別廣泛;

    • 採用完全獨立於程式語言的文字格式來儲存和表示資料;

    • 簡潔和清晰的層次結構使得JSON成為理想的資料交換語言;

    • 易於人閱讀和編寫,同時也易於機器解析和生成,並有效地提升網路傳輸效率

 

  • JavaScript:

    • 在 JavaScript 語言中,一切都是物件。因此,任何JavaScript 支援的型別都可以通過 JSON 來表示,例如字串、數字、物件、陣列等。看看他的要求和語法格式:

    • 物件表示為鍵值對,資料由逗號分隔;

    • 花括號儲存物件;

    • 方括號儲存陣列;

       

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

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

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

       

     

  • JSON 和 JavaScript 物件互轉:

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

      var obj = JSON.parse('{"a": "Hello", "b": "World"}');
      //結果是 {a: 'Hello', b: 'World'}
    • 要實現從JavaScript 物件轉換為JSON字串,使用 JSON.stringify() 方法:

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

       

 

  • 程式碼測試:

    • 測試頁面:

      <!DOCTYPE html>
      <html lang="en">
      <head>
         <meta charset="UTF-8">
         <title>Title</title>

         <script type="text/javascript">

             //編寫一個javascript物件 es6 len
             var user={
                 name:"demo",
                 age:3,
                 sex:"男"
            }
             //將JS物件轉換為JSON物件:
             var s = JSON.stringify(user);
             console.log(s);

             console.log("================");

             //將JSON物件轉換為JS物件:

             var parse = JSON.parse(s);
             console.log(parse);

         </script>
      </head>
      <body>


      </body>
      </html>

       

 

 

  • java生成JSON物件,傳給前端:Controller返回JSON資料【重點】

    • Jackson使用;

    • Fastjson使用;

 

 

  • Jackson使用:

      • Jackson應該是目前比較好的json解析工具了;

      • 當然工具不止這一個,比如還有阿里巴巴的 fastjson 等等。

      • 1,使用它需要匯入它的jar包:

        <dependency>
          <groupId>com.fasterxml.jackson.core</groupId>
          <artifactId>jackson-databind</artifactId>
          <version>2.9.8</version>
        </dependency>
      • 2,配置SpringMVC需要的配置:

      • 2.1: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>
              <!--通過初始化引數指定SpringMVC配置檔案的位置,進行關聯-->
              <init-param>
                  <param-name>contextConfigLocation</param-name>
                  <param-value>classpath:springmvc-servlet.xml</param-value>
              </init-param>
              <!-- 啟動順序,數字越小,啟動越早 -->
              <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>
      • 2.2: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">


           <!--   註解方式:掃描包-->
           <context:component-scan base-package="com.xx.controller"/>

           <!--處理器介面卡,處理器對映器-->
           <mvc:annotation-driven/>
           <!--過濾靜態資源-->
           <mvc:default-servlet-handler/>


           <!--檢視解析器-->
           <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
               <property name="prefix" value="/WEB-INF/jsp/"/>
               <property name="suffix" value=".jsp"/>
           </bean>

        </beans>
      • 2.3:編寫實體類和Controller:

        @Controller
        public class TestController {

           //把User物件轉化為JSON字串
           @RequestMapping(value = "/j1",produces = "application/json;charset=utf-8")
           @ResponseBody  //主要加了這個註解,就不會走檢視解析器,會直接返回一個字串
           public String jsondemo() throws JsonProcessingException {

               User user = new User(1,"張三","11111");
               //jsckson ObjectMapper物件
               ObjectMapper mapper = new ObjectMapper();
               String s = mapper.writeValueAsString(user);

               return s;
          }
        }
      • 2.4,配置Tomcat:啟動測試:{"id":1,"name":"??","pwd":"11111"}

         

      • 【亂碼問題】:需要設定一下編碼格式為:utf-8,以及它的返回的型別;

        • 通過@RequestMapping(value = "/j1",produces = "application/json;charset=utf-8")實現:

      • {"id":1,"name":"張三","pwd":"11111"}
      • 【注意】:使用JSON記得處理亂碼問題;

         

     

  • 程式碼優化:

    • 亂碼統一解決:

      • 上一種方法比較麻煩,如果專案中有許多請求則每一個都要新增,可以通過Spring配置統一指定,這樣就不用每次都去處理了!

      • 我們可以在springmvc的配置檔案上新增一段訊息StringHttpMessageConverter轉換配置!

        <!--處理器介面卡,處理器對映器-->
        <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>
      • 修改Controller程式碼:

        @RequestMapping(value = "/j1")
        @ResponseBody  //主要加了這個註解,就不會走檢視解析器,會直接返回一個字串
        public String jsondemo() throws JsonProcessingException {
        
        User user = new User(1,"張三","11111");
        //jsckson  ObjectMapper物件
        ObjectMapper mapper = new ObjectMapper();
        String s = mapper.writeValueAsString(user);
        return s;
        

        }

         

    • 返回json字串統一解決:

      • 在類上直接使用 @RestController ,這樣子,裡面所有的方法都只會返回 json 字串了,不用再每一個都新增@ResponseBody !我們在前後端分離開發中,一般都這樣使用 ;

        @RestController
        public class TestController {
        
        //把User物件轉化為JSON字串
        @RequestMapping(value = "/j1")
        public String jsondemo() throws JsonProcessingException {
        
            User user1 = new User(1,"張三1","11111");
            User user2 = new User(1,"張三2","11111");
            User user3 = new User(1,"張三3","11111");
            List&lt;User&gt; listUser=new ArrayList&lt;User&gt;();
            listUser.add(user1);
            listUser.add(user2);
            listUser.add(user3);
            ObjectMapper mapper = new ObjectMapper();
            String s = mapper.writeValueAsString(listUser);
            return s;
        }
        

        }

      • 測試結果:[{"id":1,"name":"張三1","pwd":"11111"},{"id":1,"name":"張三2","pwd":"11111"},{"id":1,"name":"張三3","pwd":"11111"}]

         

    • 輸出時間物件:

      • 增加一個方法:

        //json輸出時間物件
        @RequestMapping("/j3")
        public String jsondemo3() throws JsonProcessingException {
            Date date = new Date();
            //ObjectMapper,時間解析後的預設格式為:timestamp:時間戳
            return new ObjectMapper().
                writeValueAsString(date);//timestamp:1650176747348
        }
      • 預設日期格式會變成一個數字,是1970年1月1日到當前日期的毫秒數!

      • Jackson 預設是會把時間轉成timestamps形式;

         

      • 優化方案:取消Timestamp形式 , 自定義時間格式

        @RequestMapping("/j4")
        public String jsondemo4() throws JsonProcessingException {
            ObjectMapper mapper = new ObjectMapper();
            //不使用時間戳的方式
            ObjectMapper configure = mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd:HH:mm:ss");
            String format = sdf.format(new Date());
            return mapper.writeValueAsString(format);//"2022-04-17:14:34:21"
        }

         

    • 抽取為工具類:

      • 經常使用的話,我們可以將這些程式碼封裝到一個工具類中;

        @Controller
        public class JsonUtils {

           //預設日期格式
           public static String getFormatDefault(Date date){
               return getFormat(date,"yyyy-MM-dd:HH:mm:ss");
          }


           //封裝Json日期物件
           public static String getFormat(Date date,String str) {
               String resFormat=null;
               ObjectMapper mapper = new ObjectMapper();
               //不使用時間戳的方式
               ObjectMapper configure = mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
               SimpleDateFormat sdf = new SimpleDateFormat(str);
               String format = sdf.format(date);
               try {
                   resFormat= mapper.writeValueAsString(format);
              } catch (JsonProcessingException e) {
                   e.printStackTrace();
              }
               return resFormat;
          }


        }