聊聊@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
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。
上一篇: Java并发编程之同步容器与并发容器详解
下一篇: 投降的大将文聘为什么能受曹操重用?