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使用的更多相关文章

  1. springmvc配置jackson时遇到的一些问题

    在没接触springmvc之前我们在servlet中想返回前台json数据时,都是自定义一个JSONObject和JSONArray,然后调用response.getWriter()对象的方法返回js ...

  2. springMVC中jackson的使用(包含JsonFormat 时间格式)

    前台使用ajax,后台 springMVC Java下常见的Json类库有Gson.JSON-lib和Jackson等,Jackson相对来说比较高效,在项目中主要使用Jackson进行JSON和Ja ...

  3. 关于springmvc 整合jackson报错问题

    spring mvc 在整合jackson中报错如下 Context initialization failed org.springframework.beans.factory.BeanCreat ...

  4. SpringMVC 整合Jackson报错

    最近用spring4.x整合Jackson,结果莫名其妙的一直报错,网上收索的结果都是在maven或者gradle的环境下配置依赖条件解决的:但是eclipseIDE环境下的jar包应该是会自动依赖影 ...

  5. springmvc 使用Jackson的配置

    <!--start:使用Jackson 1.x的配置,需要导入的jar包:jackson-core-lpgl-xxx.jar.jackson-mapper-lgpl-xxx.jar --> ...

  6. 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 ...

  7. springmvc 使用Jackson框架的配置

    <!--start:使用Jackson 1.x的配置,需要导入的jar包:jackson-core-lpgl-xxx.jar.jackson-mapper-lgpl-xxx.jar --> ...

  8. SpringMVC学习笔记(二)

    一.导航 复杂类型的参数绑定 校验 异常处理 图片上传 json交互 拦截器 二.复杂类型参数绑定 ①.包装类型的pojo参数绑定 使用场景:实现商品查询条件传入. 实现方法:>通过添加Http ...

  9. maven构建springmvc项目

    1.Eclipse中 NEW ->OTHER->Maven->maven project 2.选择项目路径 3.选择项目类型->next->输入groupid和artif ...

  10. 教你搭建SpringSecurity3框架( 更新中、附源码)

    源码下载地址:http://pan.baidu.com/s/1qWsgIg0 一.web.xml <?xml version="1.0" encoding="UTF ...

随机推荐

  1. ffmpeg architecture(上)

    ffmpeg architecture(上) 目录 介绍 视频-您看到的是什么! 音频-您在听什么! 编解码器-缩小数据 容器-音频和视频的舒适场所 FFmpeg-命令行 FFmpeg命令行工具101 ...

  2. 将十进制数据转换为二进制AND将二进制数据转换为十进制!

    一,将十进制数据转换为二进制:  //***********************************************            Console.WriteLine(&quo ...

  3. Reactive 理解 SpringBoot 响应式的核心-Reactor

    Reactive 理解 SpringBoot 响应式的核心-Reactor bestcoding 2020-02-23 17:26:43 一.前言 关于 响应式 Reactive,前面的两篇文章谈了不 ...

  4. VBS脚本编程(10)——编写WMI脚本

    WMI介绍 1.WMI是什么? WMI--Windows管理规范(Windows Management instrumentation). 是一项核心的Windows管理技术. 采用统一的.基于开放标 ...

  5. STL----vector注意事项

    开vector时要注意内存容易炸 最好的办法就是在开vector之后,对他进行一步操作 vector<int> a; a.resize(n); n就是你要开的数组的大小,此时数组里已经插入 ...

  6. Hive和Spark分区策略

    1.概述 离线数据处理生态系统包含许多关键任务,最大限度的提高数据管道基础设施的稳定性和效率是至关重要的.这边博客将分享Hive和Spark分区的各种策略,以最大限度的提高数据工程生态系统的稳定性和效 ...

  7. .Net Core with 微服务 - Elastic APM

    上一次我们介绍了Seq日志聚合组件.这次要给大家介绍的是Elastic APM ,一款应用程序性能监控组件.APM 监控围绕对应用.服务.容器的健康监控,对接口的调用链.性能进行监控.在我们实施微服务 ...

  8. Vue3全家桶升级指南一composition API

    1.setup() vue3中的composition API中最重要的就是setup方法了,相当于组件的入口,所有的composition API都必须放到setup()中的使用. setup是在组 ...

  9. 1、centos7修改网卡名称为传统的eth0

    [root@localhost ~]# cd /etc/sysconfig/network-scripts/ [root@localhost network-scripts]#mv ifcfg-ens ...

  10. linux学习之路第七天(搜索查找类指令详解)

    搜索查找类 1.find指令 find指令将从指定目录向下递归遍历其各个子目录,将满足条件的文件或者目录显示终端. ~基本语法 find [搜索范围] [选项] ~选项说明 应用案例 案例1 :按文件 ...