1. 程式人生 > 實用技巧 >SpringMVC-09-Json

SpringMVC-09-Json

1、概念

  • Javascript Object Notation,JS物件標記,是一種輕量級的資料交換格式,採用文字格式來儲存和表示資料,有效提升網路傳輸效率

2、語法格式

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

  • 花括號儲存物件

  • 方括號儲存陣列

3、Json和JavaScript

  • 關係

    Json是JavaScript物件的字串表示法,它使用文字表示一個JS物件的資訊,實際上是一個字串

  • Json和Javascript的相互轉換

    <script type="text/javascript">

    var user = {
    name: "王寶",
    age: "24"
    };

    //Javascript轉Json
    var str = JSON.stringify(user);
    console.log(str);

    //Json轉Javascript
    var u = JSON.parse(str);
    console.log(u);

    </script>

4、Jackson

  • 匯入依賴

    <dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.10.2</version>
    </dependency>
  • 解決Json的亂碼問題:在springMVC的配置檔案中配置以下內容

    <!--Json亂碼問題解決-->
    <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>
  • 測試

    • 1、直接把Java物件的toString結果輸出

      @RestController
      public class HelloController {

      @RequestMapping("/j1")
      public String json_1(){
      User user = new User("洪夢霞",24);
      String str = user.toString();
      return str;
      }
      }

      /*
      結果為:
      User(name=洪夢霞, age=24)
      */
    • 2、使用Jackson的方法轉換物件為json字串

      @RestController
      public class JsonController {

      @RequestMapping("/j2")
      public String json_2() throws JsonProcessingException {
      User user = new User("洪夢霞", 24);
      return JacksonUtils.getJackson(user);
      }
      }

      /*
      結果為:
      User(name=洪夢霞, age=24)
      */
    • 3、使用Jackson的方法轉換列表為json字串

      @RestController
      public class JsonController {

      @RequestMapping("/j3")
      public String json_3() throws JsonProcessingException {
      ArrayList<User> users = new ArrayList<User>();
      User user1 = new User("洪夢霞1", 24);
      User user2 = new User("洪夢霞2", 24);
      User user3 = new User("洪夢霞3", 24);
      users.add(user1);
      users.add(user2);
      users.add(user3);
      return JacksonUtils.getJackson(users);
      }
      }

      /*
      結果為:
      [{"name":"洪夢霞1","age":24},{"name":"洪夢霞2","age":24},
      {"name":"洪夢霞3","age":24}]
      */
    • 4、使用Jackson的方法將日期轉換為字串

      //1、不處理,直接將日期轉換成字串
      @RestController
      public class JsonController {

      @RequestMapping("/j4")
      public String json_4() throws JsonProcessingException {
      ObjectMapper objectMapper = new ObjectMapper();
      Date date = new Date();
      return objectMapper.writeValueAsString(date);
      }
      }

      /*
      結果為:
      1585971952751(時間戳表示)
      */

      //2、利用SimpleDateFormat處理
      @RestController
      public class JsonController {

      @RequestMapping("/j4")
      public String json_4() throws JsonProcessingException {
      ObjectMapper objectMapper = new ObjectMapper();


      //設定不使用時間戳方式
      objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,false);
      //自定義日期格式
      SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
      objectMapper.setDateFormat(dateFormat);
      Date date = new Date();
      return objectMapper.writeValueAsString(date);
      }
      }

      /*
      結果為:
      "2020-04-04 11:53:32"
      */

      //3、把時間轉換這個處理成工具類
      public class JacksonUtils {

      public static String getJackson(Object object){
      return getJackson(object,"yyyy-MM-dd HH:mm:ss");
      }

      public static String getJackson(Object object,String dateFormat){
      ObjectMapper mapper = new ObjectMapper();
      mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,false);
      SimpleDateFormat simpleDateFormat = new SimpleDateFormat(dateFormat);
      mapper.setDateFormat(simpleDateFormat);

      try {
      return mapper.writeValueAsString(object);
      } catch (JsonProcessingException e) {
      e.printStackTrace();
      }
      return null;
      }
      }

      @RestController
      public class JsonController {

      @RequestMapping("/j4")
      public String json_4() throws JsonProcessingException {
      Date date = new Date();
      return JacksonUtils.getJackson(date, "yyyy-MM-dd HH:mm:ss");
      }
      }

      /*
      結果為:
      "2020-04-04 11:53:32"
      */

5、Fastjson

  • fastjson三個主要的類

    • JSONObject

      • 代表了json物件

      • 實現了Map介面,猜想JSONObject底層操作是由Map實現的

      • JSONObject對於json物件,通過各種形式的get()方法可以獲取json物件中的資料,也可利用諸如size()、isEmpty()方法獲取“鍵:值”對的個數和判斷是否為空,其本質是通過Map介面並呼叫介面中的方法完成的

    • JSONArray

      • 代表json物件陣列

      • 內部是由list介面中的方法來完成的

    • JSON

      • 代表JSONObject和JSONArray的轉化

  • 依賴

    <dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.60</version>
    </dependency>
  • 測試

    • 1、列表轉換成Json字串

      @RestController
      public class JsonController {

      @RequestMapping("/j5")
      public String json_5() {
      List<User> users = new ArrayList<User>();
      User user1 = new User("洪夢霞1", 24);
      User user2 = new User("洪夢霞2", 24);
      User user3 = new User("洪夢霞3", 24);
      users.add(user1);
      users.add(user2);
      users.add(user3);
      return JSON.toJSONString(users);
      }
      }
    • 2、Java物件和Json物件的相互轉換

      @RestController
      public class JsonController {

      @RequestMapping("/j6")
      public String json_6() {
      User user1 = new User("洪夢霞", 24);
      //Java物件轉Json字串
      String userJson1 = JSON.toJSONString(user1);
      System.out.println(JSON.toJSONString(userJson1));

      //Json字串轉Java物件
      User user2 = JSON.parseObject(userJson1, User.class);
      System.out.println(user2);

      //Java物件轉Json物件
      JSONObject jsonObject = (JSONObject) JSON.toJSON(user1);
      System.out.println(jsonObject);

      //Json物件轉Java物件
      User user3 = JSON.toJavaObject(jsonObject, User.class);
      System.out.println(user3);

      return "hello,fastJson";
      }
      }