Jackson常用注解
Jackson常用注解
@JsonIgnore
-
级别:属性或者方法级别
-
作用:对象反序列化时忽略指定的属性
-
所示包:
com.fasterxml.jackson.annotation.JsonIgnore -
用法示例:
实体类
public class TestJacksonAnnotationBean {
private String value1;
//@JsonIgnore
private String value2;
public String getValue1() {
return value1;
}
public void setValue1(String value1) {
this.value1 = value1;
}
public String getValue2() {
return value2;
}
public void setValue2(String value2) {
this.value2 = value2;
}
@Override
public String toString() {
return "TestJacksonAnnotationBean [value1=" + value1 + ", value2=" + value2 + "]";
}
}
Controller
@Controller
@RequestMapping("/test/jacksonAnnotation")
public class TestJacksonAnnotationController {
@RequestMapping("/test1")
@ResponseBody
public ResponseResult test1(@RequestBody TestJacksonAnnotationBean t) {
ResponseResult result = new ResponseResult();
System.out.println(t);
result.setSuccess(true);
result.setCode(0);
result.setData(t);
return result;
}
}
测试1
// 请求参数
{
"value1":"a",
"value2":"b"
}
// 控制台输出结果
TestJacksonAnnotationBean [value1=a, value2=b]
// 响应结果
{
"code": 0,
"success": true,
"data": {
"value1": "a",
"value2": "b"
},
"msg": null
}
下面在实体类的TestJacksonAnnotationBean的字段value2上使用@JsonIgnore注解,实体类如下
public class TestJacksonAnnotationBean {
private String value1;
@JsonIgnore
private String value2;
public String getValue1() {
return value1;
}
public void setValue1(String value1) {
this.value1 = value1;
}
public String getValue2() {
return value2;
}
public void setValue2(String value2) {
this.value2 = value2;
}
@Override
public String toString() {
return "TestJacksonAnnotationBean [value1=" + value1 + ", value2=" + value2 + "]";
}
}
同样的方式进行测试2
// 请求参数
{
"value1":"a",
"value2":"b"
}
// 控制台输出结果
TestJacksonAnnotationBean [value1=a, value2=null]
// 响应结果
{
"code": 0,
"success": true,
"data": {
"value1": "a"
},
"msg": null
}
可以看到在反序列化实体类TestJacksonAnnotationBean的时候,并没有给属性value2赋值。另外,可以看到输出的接口返回的json对象里并没有包含value2这个字段。如果你的接口并不想返回某个字段给前端,你可以在实体类上加上这个注解。
@JsonIgnoreProperties(ignoreUnknown=true)
忽略掉实体类中没有的而json中有的字段
@JsonIgnoreProperties(ignoreUnknown=true)
public class TestJacksonAnnotationBean {
private String value1;
private String value2;
// get、set方法
}
请求数据
{
"value1":"a",
"value2":"b",
"value3":"c",
"value4":"d"
}
在反序列化实体类TestJacksonAnnotationBean的时候会忽略掉多余的json字段value3和value4
@JsonProperty
给实体类的某个字段取别名,作用于序列化和反序列化
public class TestJacksonAnnotationBean {
// 给value1取别名,在接收和返回的时候都会用VALUE1替代value1
@JsonProperty(value="VALUE1")
private String value1;
private String value2;
private String value3;
private String value4;
// get、set方法
}
请求数据1
{
"value1":"a",
"value2":"b",
"value3":"c",
"value4":"d"
}
返回结果1
{
"value2": "b",
"value3": "c",
"value4": "d",
"VALUE1": "null"
}
请求数据2
{
"VALUE1":"a",
"value2":"b",
"value3":"c",
"value4":"d"
}
返回结果2
{
"value2": "b",
"value3": "c",
"value4": "d",
"VALUE1": "a"
}
@JsonPropertyOrder
属性排序,支持两种排序方式
- 自定义顺序
实体类
@JsonPropertyOrder(value= {"aalue1","balue2","calue3","dalue4"})
public class TestJacksonAnnotationBean {
private String dalue4;
private String calue3;
private String balue2;
private String aalue1;
// get、set方法
}
请求数据
{
"aalue1":"a",
"balue2":"b",
"calue3":"c",
"dalue4":"d"
}
返回结果
{
"aalue1": "a",
"balue2": "b",
"calue3": "c",
"dalue4": "d"
}
- 按照字母顺序排序
@JsonPropertyOrder(alphabetic=true)
实体类
@JsonPropertyOrder(alphabetic=true)
public class TestJacksonAnnotationBean {
private String dalue4;
private String calue3;
private String balue2;
private String aalue1;
// get、set方法
}
请求数据
{
"aalue1":"a",
"balue2":"b",
"calue3":"c",
"dalue4":"d"
}
返回结果
{
"aalue1": "a",
"balue2": "b",
"calue3": "c",
"dalue4": "d"
}
@JsonFormat
如果你的实体类的关于时间的字段是 Date类型的,像下面这样
public class TestJacksonAnnotationBean {
private Date date;
}
如果你不手动处理就将实体类直接响应给前端,得到的将是这样的结果
{
"date": 1576676780135
}
返回一个时间戳明显不是我们想要的,但是你又不想一个个的手动格式化时间,那怎么办,这时候可以使用@JsonFormat注解轻松搞定
public class TestJacksonAnnotationBean {
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone="GMT+8")
private Date date;
}
加上注解之后的返回结果
{
"date": "2019-12-18 21:56:14"
}
一个注解就搞定,有时候可以帮你少敲几十行代码,就很nice
此外注解@DateTimeFormat(位于org.springframework.format.annotation.DateTimeFormat包下)可以和@JsonFormat配套使用,当前端传过来的时间是时间戳的时候,可以使用这个注解直接将时间戳格式化
public class TestJacksonAnnotationBean {
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone="GMT+8")
private Date date;
}
请求数据
{
"date":1576677793000
}
返回数据
{
"date": "2019-12-18 22:03:13"
}
注解@DateTimeFormat使用时需注意:时间戳必须为数字类型,并且单位是毫秒
自定义序列化器
通过继承Jackson的com.fasterxml.jackson.databind.JsonSerializer类可以实现自定义的序列化规则
需要新建一个自定义序列化类
public class StatsuSerializer extends JsonSerializer<Object>{
@Override
public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
if(null==value)
gen.writeString("");
int intValue = (Integer)value;
if(intValue == 1)
gen.writeString("启用");
else
gen.writeString("禁用");
}
}
然后在实体类的字段上加上注解@JsonSerialize
public class TestJacksonAnnotationBean2 {
@JsonSerialize(using=StatsuSerializer.class)
private Integer status;
// get、set方法
}
返回值将不再是一个数字,而是一个格式化好了的字符串
{
"status": "启用"
}

浙公网安备 33010602011771号