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 ...
随机推荐
- ffmpeg architecture(上)
ffmpeg architecture(上) 目录 介绍 视频-您看到的是什么! 音频-您在听什么! 编解码器-缩小数据 容器-音频和视频的舒适场所 FFmpeg-命令行 FFmpeg命令行工具101 ...
- 将十进制数据转换为二进制AND将二进制数据转换为十进制!
一,将十进制数据转换为二进制: //*********************************************** Console.WriteLine(&quo ...
- Reactive 理解 SpringBoot 响应式的核心-Reactor
Reactive 理解 SpringBoot 响应式的核心-Reactor bestcoding 2020-02-23 17:26:43 一.前言 关于 响应式 Reactive,前面的两篇文章谈了不 ...
- VBS脚本编程(10)——编写WMI脚本
WMI介绍 1.WMI是什么? WMI--Windows管理规范(Windows Management instrumentation). 是一项核心的Windows管理技术. 采用统一的.基于开放标 ...
- STL----vector注意事项
开vector时要注意内存容易炸 最好的办法就是在开vector之后,对他进行一步操作 vector<int> a; a.resize(n); n就是你要开的数组的大小,此时数组里已经插入 ...
- Hive和Spark分区策略
1.概述 离线数据处理生态系统包含许多关键任务,最大限度的提高数据管道基础设施的稳定性和效率是至关重要的.这边博客将分享Hive和Spark分区的各种策略,以最大限度的提高数据工程生态系统的稳定性和效 ...
- .Net Core with 微服务 - Elastic APM
上一次我们介绍了Seq日志聚合组件.这次要给大家介绍的是Elastic APM ,一款应用程序性能监控组件.APM 监控围绕对应用.服务.容器的健康监控,对接口的调用链.性能进行监控.在我们实施微服务 ...
- Vue3全家桶升级指南一composition API
1.setup() vue3中的composition API中最重要的就是setup方法了,相当于组件的入口,所有的composition API都必须放到setup()中的使用. setup是在组 ...
- 1、centos7修改网卡名称为传统的eth0
[root@localhost ~]# cd /etc/sysconfig/network-scripts/ [root@localhost network-scripts]#mv ifcfg-ens ...
- linux学习之路第七天(搜索查找类指令详解)
搜索查找类 1.find指令 find指令将从指定目录向下递归遍历其各个子目录,将满足条件的文件或者目录显示终端. ~基本语法 find [搜索范围] [选项] ~选项说明 应用案例 案例1 :按文件 ...