Spring全解-06-Json互動處理
阿新 • • 發佈:2021-06-26
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 = newUser("李扶搖", 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 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; }
@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 三個主要的類:
- 內部是有List介面中的方法來完成操作的。
JSON代表 JSONObject和JSONArray的轉化
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工具包一樣,直接根據業務需要拿來用就好了。