关于LocalDateTime和Date 时间的序列化和反序列化(2)

之前关于 关于LocalDateTime和Date 时间的序列化和反序列化(1)中只是通用的设置,现在如果是对不同地方的时间进行不同的反序化和序列化格式要求,有以下两种做法(以下以序列化和Date为例子)

**方法1:使用@JsonSerialize + 自定义的序列化器 **
此方法所有的配置和文章1相同(具体查看文章页头链接)
缺点:每次都要新写序列化器

自定义的序列化器

package net.sinorock.aj.common.utils;


import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;

import java.io.IOException;
import java.util.Date;


/**
 * {@code DateSerializerUtils} 精确年月日的时间格式
 * @author nov
 */
public class DateSerializerUtils extends JsonSerializer<Date>
{
     
    @Override
    public void serialize(Date value, JsonGenerator jgen, SerializerProvider provider)
        throws IOException
    {
     
        String formattedDate = DateUtils.format(value, "yyyy/MM/dd");
        jgen.writeString(formattedDate);
    }
}

使用@JsonSerialize

	@ApiModelProperty(value = "延期时间")
    @JsonSerialize(using = DateSerializerUtils.class)
    private Date delayTime;

方法2:继承ContextualDeserializer + 注解

配置 继承 ContextualDeserializer接口

package net.sinorock.aj.common.config;


import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.BeanProperty;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.ser.ContextualSerializer;
import net.sinorock.aj.common.annotation.JsonObjectStringify;
import net.sinorock.aj.common.utils.DateUtils;

import java.io.IOException;
import java.util.Date;


/**
 * {@code CustomJsonDateSerializer} json date 序列化
 * @author nov
 */

public class CustomJsonDateSerializer extends JsonSerializer<Date> implements ContextualSerializer
{
     
    private String pattern;

    public CustomJsonDateSerializer(String pattern)
    {
     
        this.pattern = pattern;
    }

    @Override
    public void serialize(Date date, JsonGenerator jsonGenerator,
                          SerializerProvider serializerProvider)
        throws IOException
    {
     
        String dateStr = DateUtils.format(date, pattern);
        jsonGenerator.writeString(dateStr);
    }

    /**
     * {@code createContextual} createContextual的调用是先于serialize的,createContextual传入了BeanProperty,通过它能获取了到属性的注解,即JsonObjectStringify进而也能获取到JsonObjectStringify中的pattern。这样不使用JsonObjectStringify注解就用默认的格式化,使用JsonObjectStringify注解就根据pattern格式化
     * @author nov
     * @param serializerProvider  serializerProvider
     * @param property  property
     * @return com.fasterxml.jackson.databind.JsonSerializer
     */
    @Override
    public JsonSerializer<?> createContextual(SerializerProvider serializerProvider,
                                              BeanProperty property)
    {
     
        JsonObjectStringify jsonObjectStringify= property.getMember().getAnnotation(JsonObjectStringify.class);

        if (jsonObjectStringify!= null)
        {
     
            pattern = jsonFormat.pattern();
        }
        return this;
    }
}

自定义 @JsonObjectStringify 注解

package net.sinorock.aj.common.annotation;


import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;


/**
 * {@code ApiJsonObject} 序列化格式注解
 * @author nov
 */
@Target({
     ElementType.PARAMETER, ElementType.FIELD, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface JsonObjectStringify {
     

    String pattern() default "";
}

使用 @JsonObjectStringify 注释

    @ApiModelProperty(value = "整改时限")
    @JsonObjectStringify(pattern = "yyyy/MM/dd")
    private Date rectifyTime;

你可能感兴趣的:(时间序列化和反序列化,jsonFormat失效)