1.导入依赖
<!-- Jackson springMVC默认的Json解决方案选择是 Jackson,所以只需要导入jackson的jar,即可使用。-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.8</version>
</dependency>
2.使用@ResponseBody
@Controller
public class HelloController {
@RequestMapping("/getOne")
@ResponseBody //将handler的返回值,转换成json(jackson),并将json响应给客户端。
public User getOne(Integer id){
System.out.println(id);
User user = new User();
user.setId(id);
user.setName("张三");
user.setAge(18);
user.setGender("男");
return user;
}
@RequestMapping("/getAll")
@ResponseBody
public List<User> getAll(){
User user = new User();
user.setId(1);
user.setName("张三");
user.setAge(18);
user.setGender("男");
User user1 = new User();
user1.setId(2);
user1.setName("李四");
user1.setAge(19);
user1.setGender("男");
User user2 = new User();
user2.setId(3);
user2.setName("王五");
user2.setAge(20);
user2.setGender("男");
List<User> users = new ArrayList<>();
users.add(user);
users.add(user1);
users.add(user2);
return users;
}
}
3.使用@RestController
Controller类上加了@RestController注解,等价于在类中的每个方法上都加了@ResponseBody
@Controller
@RestController
public class JsonController{
@RequestMapping("/test1")
public User hello1(){
System.out.println("hello world");
User user = new User();
return user;
}
//@ResponseBody还可以用在handler的返回值上
@RequestMapping("/test2")
public List<User> hello2(){
System.out.println("hello world");
List<User> users = Arrays.asList(new User(),new User());
return users;
}
}
4.使用@RequestBody
@RequestBody, 接收Json参数
定义Handler
class User{
private Integer id;
private String name;
private Integer age;
private String gender;
//set get
}
@RequestMapping("/test5")
public User test5(@RequestBody User user){
System.out.println(user);
return user;
}
Ajax发送json jsp Ajax
function test5(){
var obj={"id1":1,"name":"","age":3,"gender":"男","birth":"2020-05-07 10:01:10"};
$.ajax({
url:"test5",
type:"post",
contentType:"application/json",
//JSON.stringify 将对象转为json字符串
data:JSON.stringify(obj),
success:function(res){
console.log(res);
}
})
}
1.如果我们的content-type 是application/x-www-form-urlencoded 参数是json对象 则后端正常接收参数 2.如果我们的content-type 是application/x-www-form-urlencoded 参数是json字符串 后端如果直接获取参数 无法获得值 如果我们的content-type 是application/x-www-form-urlencoded 参数是json字符串后端加@RequestBody 则抛出415异常 3.如果我们的content-type 是application/json 参数是json对象 后端正常接收 无法获得参数值 如果我们的content-type 是application/json 参数是json对象 后端@RequestBody 抛出400异常 4.如果我们的content-type 是application/json 参数是json字符串 后端正常接收 无法获得参数值 如果我们的content-type 是application/json 参数是json字符串 后端@RequestBody 获得值成功
contentType:"application/json" 加上这句话会将下图的content-type改为application/json
@RequestBody将请求体中的json数据转换为java对象
5.Jackson常用注解
日期格式化
1.@DateTimeFormat注解 这个注解在实体类birth上, 上述不管是加不加contentType:"application/json",都可以执行
2.@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")注解,这个只能用于contentType:"application/json"格式。
属性名修改
@JsonProperty("new_name")
public class User{
@JsonProperty("new_id") //不再使用原属性名,而是 "new_id"
private Integer id;
private String name;
....
get/set
}
输出的json:{“new_id”:xx,"name":"xx"}
自定义序列化
@JsonSerialize(using = MySerializer.class) // 使用MySerializer输出某属性
public class MySeriabler extends JsonSerializer<Double> {//自定义序列化器
@Override
public void serialize(Double value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
// 将double 值转为 BigDecimal 保留小数点后两位 (四舍五入) 转String
String s = BigDecimal.valueOf(value).setScale(2, RoundingMode.HALF_UP).toString();
gen.writeNumber(s);
}
}