Jackson自定义序列化字段
# Jackson自定义序列化字段
jdk17
在一些项目中, 我们定义好了字段类型和数据,但是前端或者第三方对接人需要我们 转换数据类型
或者 映射
或者 脱敏
,此时可以通过 jackson
的一些特性来处理这些问题.
# 问题点
package org.example;
import java.util.Date;
public record User(String id, String name, Date validity) {
}
1
2
3
4
5
6
2
3
4
5
6
实体类只有三个三字段, 现在前端想 你提供一个 enable
字段,表示是否有效,其实就是根据 validity
与当前时间做一个比较就行了.
# 1.通过怎么get方法增加字段
public record User(String id, String name, Date validity) {
public boolean getEnable() {
if(validity == null){
return false;
}else {
return validity.after(new Date());
}
}
}
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
只需要在实体类中新增一个 getEnable
方法即可.
public class AppTest extends TestCase {
public void testApp() throws JsonProcessingException {
Calendar validity = Calendar.getInstance();
validity.add(Calendar.YEAR, -1);
User user = new User("1", "张三", validity.getTime());
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(user);
System.out.println(json);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
输出结果:
{"id":"1","name":"张三","validity":1630672954037,"enable":false}
1
# 2.通过继承StdSerializer
继承 StdSerializer
类,自定义自己的序列化方案
package org.example;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.ser.std.StdSerializer;
import java.io.IOException;
import java.util.Date;
public class DateToEnableSerializer extends StdSerializer<Date> {
protected DateToEnableSerializer() {
super(Date.class);
}
@Override
public void serialize(Date date, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
if (date == null){
jsonGenerator.writeBoolean(false);
}else {
jsonGenerator.writeBoolean(date.after(new Date()));
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
User
需要重写 validity
的获取方法, 声明用自定义序列化类
public record User(String id, String name, Date validity) {
@Override
@JsonSerialize(using = DateToEnableSerializer.class)
public Date validity() {
return validity;
}
}
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
输入结果如下
{"id":"1","name":"张三","validity":false}
1
上次更新: 2023/06/12, 10:31:06