Json作为客户端和服务器端数据交换的一种很重要的数据交换格式,应用非常广泛,那么如何在Spring MVC中处理Json(接收,转化,响应…)
Spring MVC默认使用的Json解决方案选择的是Jackson,所以只需要导入Jackson的依赖就可以使用了
<dependency>
<groupId>com.fasterxml.jackson.coregroupId>
<artifactId>jackson-databindartifactId>
<version>2.4.2version>
dependency>
这个注解的作用是将返回值自动转为json并返回给客户端
我们假定在处理业务时需要返回给客户端一个Employee的对象
@RequestMapping("test1")
@ResponseBody //这个注解的作用是将返回值自动转为json并返回给客户端
public Employee test1(){
System.out.println("test1");
Employee employee = new Employee(1,"leiyu",true);
return employee;
}
方法返回值
,renturn直接返回的是我们获取到的employee对象,,由SpringMVC自动为我们转化为json
,需要添加@ResponseBody注解
小总结:当以后我们需要用到json数据时,只需要
添加这个注解
,并直接返回
@ResponseBody注解适合所有的对象类型,不论是实体,还是集合…等
@RequestMapping("test2")
@ResponseBody
public List<Employee> test2(){
System.out.println("test2 json转化复杂对象,或者说嵌套对象");
Employee employee = new Employee(1,"leiyu",true);
Employee employee1 = new Employee(1,"小白",false);
List<Employee> employeeList = Arrays.asList(employee,employee1);
return employeeList;
}
特例:@ResponseBody对字符串无转化效果
- 只有当返回值不是字符串时才会帮我们转化
- 如果是字符串类型,那么就会直接输出字符串的内容
观察这个示例,发现加了@ResponseBody注解之后,使用return返回的不再是一个页面,而是将字符直接响应给客户端
@RequestMapping("test3")
@ResponseBody
public String test3(){
System.out.println("注解对原本就是字符串的无转化,直接输出");
return "ok";//因为加了注解,这里不再转发到页面而是返回一个json字符串,而这个又是字符串类型,因为直接输出字符
}
//如果字符串是中文,那么要要设置字符集,不然会中文乱码
@RequestMapping(value = "test4",produces = "text/html;charset=utf-8")
@ResponseBody
public String test4(){
System.out.println("注解对原本就是字符串的无转化,直接输出");
return "ok";//因为加了注解,这里不再转发到页面而是返回一个json字符串,而这个又是字符串类型,因为直接输出
}
produces="text/html;charset=utf-8"
在
@RestController
中封装了@Controller
注解,在类的上写@RestController
一方面表示这个类是一个控制器类,另一方面,它会为该控制器中的所有handler都自动封装一个@ResponseBody
注解,就意味着在该控制器中的每个handler都需要返回一个json格式的数据
在@RestController中封装了@Controller |
---|
![]() |
@RequestMapping("employee")
@RestController
public class EmployeeController {
@RequestMapping("test1")
//@ResponseBody 因为有了@RestController注解,在handler中就不需要在写这个注解
public Employee test1(){
System.out.println("test1");
Employee employee = new Employee(1,"leiyu",true);
return employee;
}
}
使用@RequestBody,接收Json参数
定义Handler
public class User {
private Integer id;
private String name;
private Boolean gender;
private Date birthday;
}
定义去值方法
@RequestMapping("test2")
@ResponseBody
public String test2(@RequestBody User user){
System.out.println(user);
return "ok";
}
Ajax发送Json请求
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
Json接收响应
在日期转json时,默认使用的是日期的毫秒数
可阅读性不强,因为需要使用到日期的格式化
使用注解
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
- pattern的参数的时期格式化的格式
- timezone表示的是日期的时区,我们在东八区因为加8
public class User {
private Integer id;
private String name;
private Boolean gender;
@JsonFormat(pattern = "yyyy-MMM-dd HH:mm:ss",timezone = "GMT+8")
private Date birthday;
...
get/set
}
@JsonIgnore
在实体类的属性上加这个注解,那么会在
生成Json时忽略该属性
@JsonProperty(“new_name”)
在实体类的属性上加这个注解,那么会在
生成Json时使用新的属性名作为Json格式的属性名
Jackson默认输出null值的属性,如果不需要,可以排除
@JsonInclude(JsonInlude.Include.NON_NULL)
:表示null值 属性不输出@JsonInclude(JsonInlude.Include.NON_EMPTY)
:empty属性不输出(空串,长度为0的集合,null值)
@JsonSerialize(using= Myserializer.class) ,使用Myserializer输出某属性
如果不想使用Jackson,那么也可以使用FastJson,由于FastJson不是MVC的默认依赖方案,因此需要自己额外带入依赖和安装
<dependency>
<groupId>com.alibabagroupId>
<artifactId>fastjsonartifactId>
<version>1.1.37version>
dependency>
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>application/jsonvalue>
list>
property>
bean>
mvc:message-converters>
mvc:annotation-driven>
@ResponseBody @RequestBody @RestController使用方法不变
- 日期格式化:@FSONField(format=“yyyy/MM/dd”)
- 属性名修改: @JSONField(name=“birth”)
- 属性忽略: @JSONField(serialize = false)
- 包含null值:@JSONField(serializeFeatures = SerillizeFeature.WriteMapNullValue) 默认忽略所有null值,有此注解会输出null
- @JSONField(serialzeFeatures=SerializeFeature.WriteNullStringAsEmpty)
- 自定义序列化:@JSONField(serializeUsing = MySerializer2.class)
- MySerializer2是我们写的自定义的序列化的类
我是雷雨,一个
普本科
的学生,主要专注于Java后端和大数据开发
如果这篇文章有帮助到你,希望你给我一个
大大的赞
如果有什么问题,希望你能留言
和我一起研究
,学习靠自觉,分享靠自愿
转载注明出处
https://blog.csdn.net/qq_40742223