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 ...
随机推荐
- onnx算子大全
本文通过此脚本从def文件自动生成.不要直接修改,而是编辑算子定义. 对于算子输入/输出的可辩别的,它可以是可辩别的.不可辩别的或未定义的.如果未指定变量的可辩别的,则该变量具有未定义的可辩别的. a ...
- C++标准模板库(STL)——vector常见用法详解
vector的定义 vector<typename> name; 相当于定义了一个一维数组name[SIZE],只不过其长度可以根据需要进行变化,比较节省空间,通俗来讲,vector就是& ...
- CSS 常见问题笔记
CSS 常见问题 布局 一.盒模型宽度计算 问题:div1 的 offsetWidth 是多少? <style> #div1 { width: 100px; padding: 10px; ...
- jmeter的参数化实现
背景: 在实际的测试工作中,我们经常需要对多组不同的输入数据,进行同样的测试操作步骤,以验证我们的软件的功能.这种测试方式在业界称为数据驱动测试,而在实际测试工作中,测试工具中实现不同数据输入的过程称 ...
- 四、提高SSH服务安全
配置基本安全策略 [root@proxy ~]# vim /etc/ssh/sshd_config //调整sshd服务配置 .. .. Protocol 2 ...
- 【逆向实战】恶意勒索软件分析_披着羊皮的狼_被注入恶意代码的apk
/文章作者:Kali_MG1937 QQ:3496925334 CNBLOG博客号:ALDYS4/ 今天逛某论坛的时候发现了一篇求助贴 有意思,好久没分析过恶意软件了 今天就拿它来练练手 反编译工具 ...
- 【模拟7.27】题(liu_runda的神题)(卡特兰数,组合数)
考场的SB经验不再分享 case 0: 一道组合计数的水题,具体不再讲可以看以前的相似题 case 1: 很明显的卡特兰计数,我们把长度为n的序列看成01串 关于卡特兰计数的详细的讲解 由此可知我们需 ...
- 【NLP学习其一】什么是命名实体识别NER?
命名实体识别 概念 命名实体识别(Named Entity Recognition,简称NER) , 是指识别文本中具有特定意义的词(实体),主要包括人名.地名.机构名.专有名词等等,并把我们需要识别 ...
- UBoot的编译与烧写
每当我们学习任何编译语言之前,第一节课都是介绍我们要学习的是什么,以及编译语言和工具,最后写一个小程序编译并运行就算入门,也就是所谓的"Hello, world!".这里也不例外, ...
- Java安全之Fastjson内网利用
Java安全之Fastjson内网利用 0x00 前言 在打Fastjson的时候,基本上都是使用JNDI注入的方式去打,也就是 JdbcRowSetImpl 链分析的链去打,但是遇到一些不出网的情况 ...