Jackson常用注解

Jackson常用注解

@JsonIgnore

  1. 级别:属性或者方法级别

  2. 作用:对象反序列化时忽略指定的属性

  3. 所示包:com.fasterxml.jackson.annotation.JsonIgnore

  4. 用法示例:

实体类

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字段value3value4

@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

属性排序,支持两种排序方式

  1. 自定义顺序

实体类

@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"
}
  1. 按照字母顺序排序@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使用时需注意:时间戳必须为数字类型,并且单位是毫秒

自定义序列化器

通过继承Jacksoncom.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": "启用"
}
posted @ 2019-12-27 14:38  xxx从入门到入坟  阅读(391)  评论(0)    收藏  举报