将参数传递给在@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(还有我的Deserializer
class)?
您需要创建一个自定义注释,如下所示:
@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
.
创建反序列化器
我有一个我不确定如何 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(还有我的Deserializer
class)?
您需要创建一个自定义注释,如下所示:
@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
.