1. 程式人生 > 其它 >Spring全解-06-Json互動處理

Spring全解-06-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"}'

Controller返回JSON資料

使用Jackson作為json的解析工具

<!-- 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>

具體的使用再controller,多了一個@ResponseBody,一個ObjectMapper物件

@Controller
public class UserController {

   @RequestMapping("/json1")
   @ResponseBody
   public String json1() throws JsonProcessingException {
       //建立一個jackson的物件對映器,用來解析資料
       ObjectMapper mapper = new ObjectMapper();
       //建立一個物件
       User user = new
User("李扶搖", 3, "男"); //將我們的物件解析成為json格式 String str = mapper.writeValueAsString(user); //由於@ResponseBody註解,這裡會將str轉成json格式返回;十分方便 return str; } }

發現出現了亂碼問題,我們需要設定一下他的編碼格式為utf-8,以及它返回的型別

//produces:指定響應體返回型別和編碼
@RequestMapping(value = "/json1",produces = "application/json;charset=utf-8")

注意:以後使用json記得處理亂碼問題

但是如果每一個controller都去新增produces的話,不太理想

因此,需要統一解決亂碼問題

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

<mvc:annotation-driven>
   <mvc:message-converters register-defaults="true">
       <beanclass="org.springframework.http.converter.StringHttpMessageConverter">
           <constructor-arg value="UTF-8"/>
       </bean>
       <beanclass="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
           <property name="objectMapper">
               <beanclass="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean">
                   <property name="failOnEmptyBeans" value="false"/>
               </bean>
           </property>
       </bean>
   </mvc:message-converters>
</mvc:annotation-driven>

返回json字串統一解決

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

@RestController
public class UserController {

   //produces:指定響應體返回型別和編碼
   @RequestMapping(value = "/json1")
   public String json1() throws JsonProcessingException {
       //建立一個jackson的物件對映器,用來解析資料
       ObjectMapper mapper = new ObjectMapper();
       //建立一個物件
       User user = new User("李扶搖", 3, "男");
       //將我們的物件解析成為json格式
       String str = mapper.writeValueAsString(user);
       //由於@ResponseBody註解,這裡會將str轉成json格式返回;十分方便
       return str;
  }

}

輸出時間物件

@RequestMapping("/json3")
public String json3() throws JsonProcessingException {

   ObjectMapper mapper = new ObjectMapper();

   //建立時間一個物件,java.util.Date
   Date date = new Date();
   //將我們的物件解析成為json格式
   String str = mapper.writeValueAsString(date);
   return str;
}
  • 預設日期格式會變成一個數字,是1970年1月1日到當前日期的毫秒數!

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

即:1570198259294

解決方案:取消timestamps形式,自定義時間格式

@RequestMapping("/json4")
public String json4() throws JsonProcessingException {

   ObjectMapper mapper = new ObjectMapper();

   //不使用時間戳的方式
   mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
   //自定義日期格式物件
   SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
   //指定日期格式
   mapper.setDateFormat(sdf);

   Date date = new Date();
   String str = mapper.writeValueAsString(date);

   return str;
}

抽取為工具類

package com.li.utils;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;

import java.text.SimpleDateFormat;

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

   public static String getJson(Object object,String dateFormat) {
       ObjectMapper mapper = new ObjectMapper();
       //不使用時間差的方式
       mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
       //自定義日期格式物件
       SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
       //指定日期格式
       mapper.setDateFormat(sdf);
       try {
           return mapper.writeValueAsString(object);
      } catch (JsonProcessingException e) {
           e.printStackTrace();
      }
       return null;
  }
}

這樣以後就能直接呼叫了

@RequestMapping("/json5")
public String json5() throws JsonProcessingException {
   Date date = new Date();
   String json = JsonUtils.getJson(date);
   return json;
}

FastJson

fastjson.jar是阿里開發的一款專門用於Java開發的包,可以方便的實現json物件與JavaBean物件的轉換,實現JavaBean物件與json字串的轉換,實現json物件與json字串的轉換。實現json的轉換方法很多,最後的實現結果都是一樣的。

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

fastjson 三個主要的類:

JSONObject 代表 json 物件

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

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

JSONArray 代表 json 物件陣列

  • 內部是有List介面中的方法來完成操作的。

JSON代表 JSONObject和JSONArray的轉化

  • JSON類原始碼分析與使用

  • 仔細觀察這些方法,主要是實現json物件,json物件陣列,javabean物件,json字串之間的相互轉化。

package com.li.controller;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.kuang.pojo.User;

import java.util.ArrayList;
import java.util.List;

public class FastJsonDemo {
   public static void main(String[] args) {
       //建立一個物件
       User user1 = new User("秦疆1號", 3, "男");
       User user2 = new User("秦疆2號", 3, "男");
       User user3 = new User("秦疆3號", 3, "男");
       User user4 = new User("秦疆4號", 3, "男");
       List<User> list = new ArrayList<User>();
       list.add(user1);
       list.add(user2);
       list.add(user3);
       list.add(user4);

       System.out.println("*******Java物件 轉 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字串 轉 Java物件*******");
       User jp_user1=JSON.parseObject(str2,User.class); 
       System.out.println("JSON.parseObject(str2,User.class)==>"+jp_user1);

       System.out.println("\n****** Java物件 轉 JSON物件 ******");
       JSONObject jsonObject1 = (JSONObject) JSON.toJSON(user2);
       System.out.println("(JSONObject) JSON.toJSON(user2)==>"+jsonObject1.getString("name"));

       System.out.println("\n****** JSON物件 轉 Java物件 ******");
       User to_java_user = JSON.toJavaObject(jsonObject1, User.class);
       System.out.println("JSON.toJavaObject(jsonObject1, User.class)==>"+to_java_user);
  }
}

這種常用的工具類,只要掌握實用就好了,就像io工具包一樣,直接根據業務需要拿來用就好了。