springMVC-8-jackson使用
springMVC默认的 Json 解决方案是 Jackson, 所以只需要导入 Jackson 的 jar, 即可使用
<!--Jackson-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.8</version>
</dependency>
</dependencies>
jackson 可以通过以下三个注解来实现对 json 数据的处理:
- @ResponseBody
- @RestController
- @RequestBody
一、@ResponseBody
含义:把这个handler的返回值转成json返回给客户端, 所以此handler不会跳转到相关JSP页面, 如果返回的是字符串, 则不会转成Json, 直接返回
示例:
@ResponseBody
@RequestMapping(value="test")
//这个注解的意思是: 把这个handler的返回值转成json返回给客户端, 所以此handler不会跳转到相关JSP页面, 如果返回的是字符串, 则不会转成Json, 直接返回
public byte[] test(@RequestBody String requestBody){
return "testString";
}
乱码问题:
注意: 此时由于未调用springMVC操作转json, 直接返回中文会有乱码问题, 需要我们设置编码格式, 设置方式为在@RequestMapping注解的参数中指定 value = "/test2", produces = "text/html;charset=utf-8"
@ResponseBody
@RequestMapping(value = "/responseBody",produces = "text/html;charset=utf-8" )
public String testResponseBody(){
return "服务器数据";
}
二、@RestController
当我们在一个Controller中的所有handler前都要加@ResponseBody注解时, 我们可以在这个Controller前面加上@RestController注解, 这样, 其下的所有@ResponseBody注解都不需要加了, 同时, @RestController是一个复合注解, 其中集成了@Controller, 所以@Controller注解也可以省略,
@RestController
public class TestControl {
private EmployeeDao employeeDao;
@Autowired
public void setEmployeeDao(EmployeeDao employeeDao) {
this.employeeDao = employeeDao;
}
private DepartmentDao departmentDao;
@Autowired
public void setDepartmentDao(DepartmentDao departmentDao) {
this.departmentDao = departmentDao;
}
//--------------------------------------------------//
//测试requestBody
@RequestMapping(value ="/testRequestBody",produces = "text/html;charset=utf-8")
public Collection<Employee> getEmployee(){
return employeeDao.getAll();
}
}
三、@RequestBody
@RequestBody 注解可以用来接收请求的 json 数据
示例:
index.jsp
<button class="btn btn-primary" onclick="send_json();">ajax</button>
<script type="text/javascript">
function send_json() {
//创建要转换成json的对象
var data = {name:"wang"};
//把这个对象转换成json数据
var person = JSON.stringify(data);
//$.ajax()内传入的是一个对象
$.ajax({
//url:"local:8080/testRequestBody
url:"/testRequestBody",
type: "post",
data: person,
dataType:"json",
contentType:"application/json",
success:function (res) {
alert(res);
}
})
}
</script>
control
//测试requestBody
@RequestMapping(value ="/testRequestBody",produces = "text/html;charset=utf-8")
public Collection<Employee> getEmployee(@RequestBody Person person){
System.out.println(person);
return employeeDao.getAll();
}
注意点:
1、我们这里因为转了json,所以之前在@RequestMapping(value = "/responseBody",produces = "text/html;charset=utf-8" )上的produces一定要删掉,不然就会因为不是json数据,客户端姐接受不了,而报406的错误

2、客户端传入的json数据不是一定要和pojo种的属性名一致
jsp中:
var data = {personName:"wang",personAge:"11"};
pojo
private String name;
private Integer age;
四、json的进阶操作
我们可以添加一些 person的注解来处理 Jackson 返回的 json 数据.
修改pojo
@Repository
public class Person {
private String name;
private Integer age;
private Date date;
省略。。。。
}
control
//测试requestBody
@RequestMapping(value ="/testRequestBody")
public Person getEmployee(@RequestBody Person person){
System.out.println(person);
//给jsp传一个带时间的数据,观察在jsp页面会怎么处理
Person newPerson = new Person("zuo", 56, new Date());
System.out.println("-------->>"+newPerson);
return newPerson;
}
会发现
客户端:

服务端:

1、@JsonFormat
用户更改输出的 Date 类型数据的格式
@Repository
public class Person {
private String name;
private Integer age;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date date;
省略。。。。
}
客户端:

服务端:(可见这种格式化是在实例化对象的时候就会进行的)

访问结果:(日期已显示规范格式, 但默认时区非东八区)
修改
@Repository
public class Person {
private String name;
private Integer age;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
private Date date;
省略。。。。
}
访问结果:(东八区时间)

2、@JsonIgnore
添加了该属性的值将不会出现在返回的 json 数据中.
@Repository
public class Person {
private String name;
@JsonIgnore
private Integer age;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
private Date date;
省略。。。
}
客户端:

服务端:

会发现:
传过来的json造好的实例化对象也没有给age注入age属性,结论:json数据转实例化对象和实例化对象转json时都会把@JsonIgnore注解的属性给忽略掉
3、@JsonProperty
默认情况下, json 中的 key 值和类中的属性名是相同的, 此注解用来重命名.
主要针对json转成pojo实例的过程
@Repository
public class Person {
private String name;
@JsonProperty(value = "AGE")
private Integer age;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
private Date date;
...
}
传出的数据age属性变成了AGE

4、@JsonSerialize
为展示的数据添加修饰器, 修饰器可自定义
可以理解为在json转成pojo实例的过程中,对一个特定的数据进行自定义的处理
创建 MySerializer.java:(用于将数据进行四舍五入并返回处理后的值)
//要增对哪个数据,就把他的类型写到这个继承类的泛型中
public class Myseralizer extends JsonSerializer<Double>{
//在这个重写方法中处理数据
//入参的Double value即为json中的数据,输出之后就会被用来创建实例化对象
@Override
public void serialize(Double value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
//四舍五入的操作
String num = BigDecimal.valueOf(value).setScale(2,BigDecimal.ROUND_HALF_UP).toString();
//用入参JsonGenerator gen进行输出
//用gen的好处:可以选择不同的方法,输出不同类型的数据
gen.writeNumber(num);
}
}
在pojp中配置这个修饰器
@Repository
public class Person {
private String name;
@JsonProperty(value = "AGE")
private Integer age;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
private Date date;
@JsonSerialize(using = Myseralizer.class)
private Double salary;
}
control创建实例化对象给客户端也修改一下
//测试requestBody
@RequestMapping(value ="/testRequestBody")
public Person getEmployee(@RequestBody Person person){
System.out.println(person);
//给jsp传一个带时间的数据,观察在jsp页面会怎么处理
Person newPerson = new Person("zuo", 56, new Date(),100000.873);
System.out.println("-------->>"+newPerson);
return newPerson;
}
index.jsp
var data = {name:"wang",age:"11",salary:"100000.873"};
客户端结果:(会发现数据被处理了,说明正常实例化对象数据也会被处理)
f
服务端:(会发现数据被处理了,说明json实例化对象数据也会被处理)
springMVC-8-jackson使用的更多相关文章
- springmvc配置jackson时遇到的一些问题
在没接触springmvc之前我们在servlet中想返回前台json数据时,都是自定义一个JSONObject和JSONArray,然后调用response.getWriter()对象的方法返回js ...
- springMVC中jackson的使用(包含JsonFormat 时间格式)
前台使用ajax,后台 springMVC Java下常见的Json类库有Gson.JSON-lib和Jackson等,Jackson相对来说比较高效,在项目中主要使用Jackson进行JSON和Ja ...
- 关于springmvc 整合jackson报错问题
spring mvc 在整合jackson中报错如下 Context initialization failed org.springframework.beans.factory.BeanCreat ...
- SpringMVC 整合Jackson报错
最近用spring4.x整合Jackson,结果莫名其妙的一直报错,网上收索的结果都是在maven或者gradle的环境下配置依赖条件解决的:但是eclipseIDE环境下的jar包应该是会自动依赖影 ...
- springmvc 使用Jackson的配置
<!--start:使用Jackson 1.x的配置,需要导入的jar包:jackson-core-lpgl-xxx.jar.jackson-mapper-lgpl-xxx.jar --> ...
- SpringMVC 集成 jackson,日志格式报错:org.codehaus.jackson.map.JsonMappingException: Can not construct instance of java.util.Date from String value
org.codehaus.jackson.map.JsonMappingException: Can not construct instance of java.util.Date from Str ...
- springmvc 使用Jackson框架的配置
<!--start:使用Jackson 1.x的配置,需要导入的jar包:jackson-core-lpgl-xxx.jar.jackson-mapper-lgpl-xxx.jar --> ...
- SpringMVC学习笔记(二)
一.导航 复杂类型的参数绑定 校验 异常处理 图片上传 json交互 拦截器 二.复杂类型参数绑定 ①.包装类型的pojo参数绑定 使用场景:实现商品查询条件传入. 实现方法:>通过添加Http ...
- maven构建springmvc项目
1.Eclipse中 NEW ->OTHER->Maven->maven project 2.选择项目路径 3.选择项目类型->next->输入groupid和artif ...
- 教你搭建SpringSecurity3框架( 更新中、附源码)
源码下载地址:http://pan.baidu.com/s/1qWsgIg0 一.web.xml <?xml version="1.0" encoding="UTF ...
随机推荐
- 基于区域的CNN(R-CNN)
基于区域的CNN(R-CNN) Region-based CNNs (R-CNNs) 基于区域的卷积神经网络或具有CNN特征的区域(R-CNN)是一种将深度模型应用于目标检测的开创性方法.在本节中,将 ...
- STM32使用DMA发送串口数据
1.概述 上一篇文章<STM32使用DMA接收串口数据>讲解了如何使用DMA接收数据,使用DMA外设和串口外设,使用的中断是串口空闲中断.本篇文章主要讲解使用DMA发送数据,不会讲解基础的 ...
- python 利用三方的xlrd模块读取excel文件,处理合并单元格
目的: python能使用xlrd模块实现对Excel数据的读取,且按照想要的输出形式. 总体思路: (1)要想实现对Excel数据的读取,需要用到第三方应用,直接应用. (2)实际操作时候和我 ...
- [Azure DevOps] 编译时自动修改版本号
1. 需求 在使用 Pipeline 自动化 CI/CD 流程的过程中,我还还需要自动修改程序集的版本号.这个功能 EdiWang 和LeoLaw 都写文章讲解过做法.不过我的项目基本都是 .Net ...
- 【题解】T749 localmaxima
# T749 localmaxima 权限限制没有超链接 题目描述 Description 给出一个排列,若其中一个数比它前面的数都大,则称为localmaxima数,求一个随机排列中localmax ...
- 【题解】斐波拉契 luogu3938
题目 题目描述 小 C 养了一些很可爱的兔子. 有一天,小 C 突然发现兔子们都是严格按照伟大的数学家斐波那契提出的模型来进行 繁衍:一对兔子从出生后第二个月起,每个月刚开始的时候都会产下一对小兔子. ...
- SpringCloud Alibaba实战(7:nacos注册中心管理微服务)
源码地址:https://gitee.com/fighter3/eshop-project.git 持续更新中-- 在上一节我们已经完成了Nacos Server的本地部署,这一节我们学习如何将Nac ...
- C++中封装和继承的访问权限
众所周知,C++面向对象的三大特性为:封装,继承和多态.下面我们就先对封装做一些简单的了解.封装是通过C++中的类来完成的,类是一种将抽象转换为用户定义类型的工具.类的定义如下: class circ ...
- 9.6、zabbix监控总结
1.自动发现和自动注册的区别: (1)自动发现: 1)用于zabbix-agent的被动模式,是zabbix-server主动去添加主机.在web上创建自动发现的规则 后,zabbix-server会 ...
- 10、pfile和spfile文件详解
10.1.介绍: 1.Oracle中的参数文件是一个包含一系列参数以及参数对应值的操作系统文件.它们是在数据库实例启动时候加载的, 决定了数据库的物理结构.内存.数据库的限制及系统大量的默认值.数据库 ...