1. 程式人生 > 程式設計 >聊聊@RequestBody和Json之間的關係

聊聊@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<Strhttp://www.cppcns.coming,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”,”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 -->
<depende程式設計客棧ncy>
    <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.write程式設計客棧ValueAsString(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 和 物件 之間相cKsGmzAHzc互轉換

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);
 www.cppcns.com       System.out.println(hd2);
    }

說明:主要方法有 mapper.writeValueAsString 和 mapper.readValue

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援我們。