楔子: 只会提交表单参数,不会提交Json的?
application/json application/xml等格式数据,必须使用@RequestBody来使用。
【项目架构】:
【建立User类】:
package com.zhangyiyi.chapter1.domain;
import java.io.Serializable;
public class User implements Serializable {
private String userName;
private String phoneNum;
private String passWd;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPhoneNum() {
return phoneNum;
}
public void setPhoneNum(String phoneNum) {
this.phoneNum = phoneNum;
}
public String getPassWd() {
return passWd;
}
public void setPassWd(String passWd) {
this.passWd = passWd;
}
}
【Controller入口代码】:
@PostMapping(value = "/login_json")
public void loginJson(@RequestBody User user,HttpServletResponse response)throws Exception{
ObjectMapper mapper=new ObjectMapper();//提供功能将java对象转换成对应的JSON
logger.info(mapper.writeValueAsString(user));//将user对象转换成json输出
user.setUserName("梳子不爱头发");//更改用户名
response.setStatus(200);
response.setContentType("text/html;charset=UTF-8");
//将user类转成json输出到客户端
response.getWriter().println(mapper.writeValueAsString(user));
}
【postman访问】:
【返回值】:
注意:请求body名称必须与User类中属性名保持一致
【升级版】
以上的登录请求要求Json请求参数必须与User类中属性名保持一致,但是有时候需要取名不一致,比如java类是驼峰法命名,二postman更喜欢全部小写或者加下划线呢?不怕这里有@JsonProperty强大注解。
@JsonProperty 此注解用于属性上,作用是把该属性的名称序列化为另外一个名称。例如:
@JsonProperty(value = "user_name")
private String userName;
就是将userName属性序列化为user_name.
同样的代码,现在我们将postman的参数更改:
{
"phone_num":"18390980140",
"user_name":"ee",
"password":"123456"
}
同样成功返回。Spring默认使用Jackson处理json工具
【使用fastjson转换工具】 :开源包,来自阿里巴巴https://github.com/alibaba/fastjson
【使用方式】:在pom里面加依赖:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.51</version>
</dependency>
代码:
@PostMapping(value = "/login_json")
public void loginJson(@RequestBody User user,HttpServletResponse response)throws Exception{
// ObjectMapper mapper=new ObjectMapper();//提供功能将java对象转换成对应的JSON
logger.info(JSONObject.toJSONString(user));//将user对象转换成json输出
user.setUserName("梳子不爱头发");//更改用户名
response.setStatus(200);
response.setContentType("text/html;charset=UTF-8");
//将user类转成json输出到客户端
// response.getWriter().println(mapper.writeValueAsString(user));
response.getWriter().println(JSONObject.toJSONString(user));
}
这种转换方式倒是挺方便的。
输出同上
【升级版】:
SpringMVC提供直接将domain 对象转换成JSON的功能。代码简单到爆炸,只需要返回一个对象即可:
@PostMapping(value = "/login_json")
public Object loginJson(@RequestBody User user)throws Exception{
user.setUserName("梳子不爱头发");//更改用户名
userList.add(user);
return user;
}
输出如下:
利用springmvc自带工具可以很简单完成对象和json的数据转换