fastjson序列化时间自定义格式

Java8 的日期相关 API用起来是真香,但免不了遇到在用旧版 1.0 API 的情况。这不,跟另一个部门做对接,人家说你发过来的时间怎么带个 T,我这边没法解析。。。我回头就是一句xxx,情绪发泄完该做的事咱也得做不是,下面就看看怎么处理这个问题。
首先建一个项目,添加依赖

    
        
            org.springframework.boot
            spring-boot-starter-web
        
        
            com.alibaba
            fastjson
            1.2.80
        
        
            org.projectlombok
            lombok
            1.18.20
        
    

写个带有时间属性的类,就叫 Task 吧,

@Data
@Accessors(chain = true)
public class Task {

    private String name;

    private LocalDateTime startTime;

    private LocalDateTime endTime;
}

看一下 fastjson 序列化方法,发现可以传个配置对象,看看这个能不能解决问题

/**
 * @param object 要序列化的对象
 * @param config 序列化配置
 * @param features
 */
public static String toJSONString(Object object, SerializeConfig config, SerializerFeature... features)

这个配置类里面有一个 put 方法,可以设置不同的类型使用不同的序列化器,所以我们可以通过给日期类型设置自定义的序列化器来实现自定义日期格式

/**
 * @param type 类型
 * @param value 序列化器
 */
public boolean put(Type type, ObjectSerializer value)

自定义序列化器并重写序列化方法,这里只针对 LocalDateTime 类型进行了自定义,其他类型如出一辙。

public class JsonSerializer implements ObjectSerializer {
    @Override
    public void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType, int features) throws IOException {
        SerializeWriter out = serializer.getWriter();
        if (object == null) {
            serializer.getWriter().writeNull();
            return;
        }
        // 对LocalDateTime类型进行格式转化
        out.write("\"" + ((LocalDateTime) object).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")) + "\"");
    }
}

配置类中注入 Spriing 容器

@Configuration
public class JsonConfig {

    @Bean
    public SerializeConfig serializeConfig() {
        SerializeConfig config = new SerializeConfig();
        // 对LocalDateTime类型指定自定义的序列化器
        config.put(LocalDateTime.class, objectSerializer());
        return config;
    }

    @Bean
    public ObjectSerializer objectSerializer() {
        return new JsonSerializer();
    }
}

写个接口坐下测试

@RestController
@RequestMapping
public class FastJsonDemo {

    @Autowired
    private SerializeConfig serializeConfig;

    @RequestMapping("/test")
    public String jsonTest() {
        LocalDateTime now = LocalDateTime.now();
        Task task = new Task().setName("拯救地球任务").setStartTime(now).setEndTime(now.plusDays(10));
        return JSON.toJSONString(task, serializeConfig);
    }
}

浏览器调用接口,看下结果


image.png

日期里面的 T 没有了,搞定!

你可能感兴趣的:(fastjson序列化时间自定义格式)