java中的JsonSerializer⽤法,前后端单位转换必备
⽬录
java中的JsonSerializer⽤法
背景
演⽰
解决⽅法
JackJson中⾃定义JsonSerializer使⽤
1、⾃定义类继承JsonSerializer
2、在实体类的字段上
3、使⽤效果
java中的JsonSerializer⽤法
背景
今天在写项⽬的时候遇到⼀个问题,项⽬中有个类中有创建时间和更新时间两个属性,但是单位在后端⽤的是Date,⽽前端给的API中⽤的是秒。这就涉及到单位的转换问题。但是如何优雅地对单位进⾏转化呢?
演⽰
解决⽅法
利⽤@JsonSerialize注解,可以⽅便地实现将date数据转换成long型数据等功能,该注解作⽤在属性的getter()⽅法上。1. 写⼀个负责转换的类,继承⾃JsonSerializer类,⾥⾯写好规则
public class Date2LongSerializer extends JsonSerializer<Date> {
@Override
public void serialize(Date date, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {//把Date转成Long
jsonGenerator.Time() / 1000);
}
}
2. 在返回的参数⾥加上注解@JsonSerialize(using = XXX.class) XXX为上⼀步新建的转换类
//创建时间
@JsonSerialize(using = Date2LongSerializer.class)//时间戳将Date转成Long
private Date categoryTime;
//修改时间
@JsonSerialize(using = Date2LongSerializer.class)
private Date updateTime;
这样就完成了时间戳的转换。
JackJson中⾃定义JsonSerializer使⽤
最近在做⼀个需求,⼀个时间字段,数据库类型为timestamp,默认值为'1970-01-01 08:00:01',产品要求这种情况展⽰为“-1”,实体类中的属性类型为Date,我也不能把Date属性值设置为“-1”,⼜不想新加⼀个String类型的属性,那怎么办呢?
遇到这种问题,可以使⽤JackJson的@JsonSerialize,具体实现如下:
1、⾃定义类继承JsonSerializer
public class DefaultTimeSerializer extends JsonSerializer<Date> {
/**
* Method that can be called to ask implementation to serialize
* values of type this serializer handles.
*
* @param value      Value to serialize; can <b>not</b> be null.
springboot其实就是spring
* @param gen        Generator used to output resulting Json content
* @param serializers Provider that can be used to get serializers for
*/
@Override
public void serialize(Date value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
if (THOUSAND_MILLISECOND.Time())) {
gen.writeString("-1");
} else {
gen.writeString(DateUtils.dateFormat(value, DateUtils.MONTH_PATTERN));
}
}
}
2、在实体类的字段上
使⽤@JsonSerialize注解,并且指定要使⽤的Serializer
/**
* ⽇期(精确到⽉)
*/
@JsonSerialize(using = DefaultTimeSerializer.class)
private Date Time;
3、使⽤效果
其实使⽤SpringBoot的@RestController注解,我们最终返回的结果集都会被转换为Json信息,那么就没有类型⽽⾔,因为都是String格式的了。
以上为个⼈经验,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。