将参数传递给在@JsonSerialize 和@JsonDeserialize 中使用的 Java class

Passing arguments to Java class used in @JsonSerialize and @JsonDeserialize

我有一个我不确定如何 google 的场景,所以我会自己提出一个问题。如果它是重复的,请 link 它在这里,所以我可以给这个问题信用。

无论如何,

我有一个 Java 对象,其字段具有以下注释:

@JsonSerialize(using = CustomSerializer.class)
@JSonDeserialize(using = CustomDeserializer.class)
private Date systemDate;

业务规定不同数据库中的某些 systemDate 值具有不同的时区(不确定为什么它们没有标准化为 UTC)。

这是我的例子 CustomSerializer.java:

@Override
public void serialize(Date, value, JsonGenerator gen, SerializerProvider arg2) throws IOException {
    SimpleDateFormat formatter = new SimpleDateFormat("dd-MMM-yy");
    formatter.setTimeZone(TimeZone.getTimeZone("CET"));
    if (value == null) {
        gen.writeNull();
    } else {
        gen.writeString(formatter.formate(value.getTime()));
    }
}

不是为每个时区创建一个新的序列化器class,而是有没有办法将时区参数传递给这个class(还有我的Deserializerclass)?

您需要创建一个自定义注释,如下所示:

@Target({ ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
@JacksonAnnotation
public @interface DateSerialize {
    String timeZone();
}

现在在字段中 systemDate 通过传递时区添加这个新注释

@DateSerialize(timeZone = "UTC")
@JsonSerialize(using = CustomSerializer.class)
@JSonDeserialize(using = CustomDeserializer.class)
private Date systemDate;

您的序列化程序 class 应该实现 ContextualSerializer 这将使我们能够从我们可以获得注释详细信息的地方获得 BeanProperty

public class DateSerializer extends JsonSerializer<Date> implements ContextualSerializer {
    String timeZone;

    public DateSerializer() {
        this("UTC");
    }    
    
    public DateSerializer(String tz) {
        timeZone = tz;
    }

    @Override
    public void serialize(Date value, JsonGenerator gen, SerializerProvider provider) throws IOException {
        SimpleDateFormat formatter = new SimpleDateFormat("dd-MMM-yy");
        formatter.setTimeZone(TimeZone.getTimeZone(timeZone));
        if (value == null) {
            gen.writeNull();
        } else {
            gen.writeString(formatter.format(value.getTime()));
        }
    }

    @Override
    public JsonSerializer<?> createContextual(SerializerProvider prov, BeanProperty property) throws JsonMappingException { 
        DateSerialize annotation = property.getAnnotation(DateSerialize.class);
        String tz = (annotation == null) ? "UTC" : annotation.timeZone();   
        return new DateSerializer(tz);
    }
}

同样,您可以通过实现 ContextualDeserializer.

创建反序列化器