DXP BLOG
首页
  • JDk
  • Spring系列
  • 微服务
  • Json
  • Netty
  • Bug
  • Mysql
  • Postgresql
  • 达梦
  • activemq
  • rabbitmq
  • rocketmq
  • redis
  • Vue
  • React
  • Angular
  • Javascript
  • Typescript
linux
  • 协议
  • 加解密
  • 分类
  • 标签
  • 归档
Gitee (opens new window)

董新平

一个普普通通的代码程序猿
首页
  • JDk
  • Spring系列
  • 微服务
  • Json
  • Netty
  • Bug
  • Mysql
  • Postgresql
  • 达梦
  • activemq
  • rabbitmq
  • rocketmq
  • redis
  • Vue
  • React
  • Angular
  • Javascript
  • Typescript
linux
  • 协议
  • 加解密
  • 分类
  • 标签
  • 归档
Gitee (opens new window)
  • JDK

  • Spring系列

  • Json

    • Jackson自定义序列化字段
      • 问题点
      • 1.通过怎么get方法增加字段
      • 2.通过继承StdSerializer
  • JAVA
  • Json
dongxinping
2022-09-03
目录

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

实体类只有三个三字段, 现在前端想 你提供一个 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

只需要在实体类中新增一个 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

输出结果:

{"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

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

输入结果如下

{"id":"1","name":"张三","validity":false}
1
上次更新: 2023/06/12, 10:31:06
Aop中使用SPEL

← Aop中使用SPEL

最近更新
01
Redis数据类型
01-20
02
Atomic
12-27
03
编译安装Redis
12-27
更多文章>
dongxinping | Copyright © 2022-2024 Dongxinping | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式