聊聊@RequestBody和Json之間的關系
在使用springmvc的時候,後臺@RequestBody接受的是一個json格式的字符串,一定是一個字符串。
我們可以通過@RequestBody Map
@RequestMapping(value="/queryAccountList.do",produces="application/json;charset=UTF-8") @ResponseBody public HashMap<String, Object> queryAccountList(@RequestBody Map<String, Object> paramsMap){ System.out.println("paramsMap="+paramsMap); String channel= (String) paramsMap.get("channel"); String function_code=(String) paramsMap.get("function_code"); Map<String, Object> reqParam=(Map<String, Object>)paramsMap.get("data");
當前端調用我們的接口時,傳入json字符串,就轉為瞭map對象。這裡主要是@RequestBody的底層實現,我們不討論。
json對象和json字符串的區別:
var person={“name”:”zhangsan”,”sex”:”男”,”age”:”24”}//json對象 var person='{“name”:”zhangsan”,”sex”:”男”,”age”:”24”}';//json字符串
json對象轉為json字符串,調用stringify方法:
var person={"name":"zhangsan","sex":"男","age":"24"};//json對象 var personString = JSON.stringify(person); alert(personString);
SpringMVC接受json字符串類型
在SpringMVC中基於REST開發時,前端傳入後臺的應該是一個json格式的字符串,而不是一個json對象
GET、POST方式提時, 根據request header Content-Type的值來判斷:
application/x-www-form-urlencoded, 可選(即非必須,因為這種情況的數據@RequestParam, @ModelAttribute也可以處理,當然@RequestBody也能處理);
multipart/form-data, 不能處理(即使用@RequestBody不能處理這種格式的數據);
其他格式, 必須(其他格式包括application/json, application/xml等。這些格式的數據,必須使用@RequestBody來處理)。
@RequestBody 處理類型 和 對象 和 json相互轉換
1 @RequestBody 處理類型
在項目中經常看到controller 中有 @RequestBody 字樣,他到底有什麼作用?
一般使用表單提交數據時不需要使用@RequestBody 即可自動封裝數據到對應的 Bean 中。@RequestBody 用來處理Content-Type: application/json, application/xml等
它是通過使用HandlerAdapter 配置的HttpMessageConverters來解析post data body,然後綁定到相應的bean上的。
說明:使用 @RequestBody 解析數據需要添加 jackson 或 fastjson 依賴包。
maven 引入 fastjson 包
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.51</version> </dependency>
2 對象 和 json 相互轉換
在項目中經常會遇到對象和 json 之間相互轉換,公共類 和 json 對象轉換, 靜態內部類 和 json 對象轉換
2.1 沒有內部類時 Student 類
@Data public class Student { private String id; private String name; private int age; private String sex; @Override public String toString() { return ToStringBuilder.reflectionToString(this); } }
json 和 對象 相互轉換
public static void main(String[] args) throws IOException { ObjectMapper mapper = new ObjectMapper(); Student student = new Student(); student.setName("good"); String s = mapper.writeValueAsString(student); System.out.println(s); Student hd2 = mapper.readValue(s, Student.class); System.out.println(hd2); }
2.2 有靜態內部類時 Student 類
@Data public class Student { private String id; private String name; private int age; private String sex; private HomeData homeData; private BigDecimal salary; private String[] tel; @Override public String toString() { return ToStringBuilder.reflectionToString(this); } @Data public static class HomeData{ private Address address; @Override public String toString() { return ToStringBuilder.reflectionToString(this); } @Data public static class Address { private String country; private String city; @Override public String toString() { return ToStringBuilder.reflectionToString(this); } } } }
json 和 對象 之間相互轉換
public static void main(String[] args) throws IOException { ObjectMapper mapper = new ObjectMapper(); Student student = new Student(); Student.HomeData homeData = new Student.HomeData(); Student.HomeData.Address address = new Student.HomeData.Address(); address.setCountry("中國"); address.setCity("上海"); homeData.setAddress(address); student.setHomeData(homeData); String s = mapper.writeValueAsString(address); System.out.println(s); Student.HomeData.Address hd2 = mapper.readValue(s, Student.HomeData.Address.class); System.out.println(hd2); }
說明:主要方法有 mapper.writeValueAsString 和 mapper.readValue
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- 詳解Java-Jackson使用
- @RequestBody不能映射到對象的解決
- Java springboot接口迅速上手,帶你半小時極速入門
- 使用ObjectMapper把Json轉換為復雜的實體類
- 關於json序列化(javaBean轉Json的細節處理)