欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

聊聊@RequestBody和Json之间的关系

程序员文章站 2022-06-18 23:46:14
在使用springmvc的时候,后台@requestbody接受的是一个json格式的字符串,一定是一个字符串。我们可以通过@requestbody map @requestmapping(va...

在使用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

以上为个人经验,希望能给大家一个参考,也希望大家多多支持。

相关标签: @RequestBody Json