gpt4 book ai didi

java - jackson 自定义日期序列化程序

转载 作者:搜寻专家 更新时间:2023-10-31 19:45:38 27 4
gpt4 key购买 nike

我需要为类的日期序列化设置格式。我有 Jackson 的版本,它没有 @JsonFormat。这就是我编写自定义类的原因:

public class CDJsonDateSerializer extends JsonSerializer<Date>{

@Override
public void serialize(Date date, JsonGenerator jsonGenerator, SerializerProvider provider) throws IOException {
SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy");
String dateString = dateFormat.format(date);
jsonGenerator.writeString(dateString);
}

并使用它:

@JsonSerialize(using = CDJsonDateSerializer.class)
private Date startDate;

但是,我有另一个具有不同日期格式的字段,我不想为序列化创建另一个类。我可以将所有需要的格式(如常量)添加到 CDJsonDateSerializer 类并使用注释 @JsonSerialize 设置需要的格式吗?像这样:

@JsonSerialize(using = CDJsonDateSerializer.class, CDJsonDateSerializer.FIRST_FORMAT)

在下面的答案之后:

经过一些更正后它可以工作。我已经更改了在 createContextual 方法中获取注释的方式:

@Override
public JsonSerializer createContextual(SerializationConfig serializationConfig, BeanProperty beanProperty) {
return new CustomDateSerializer(beanProperty.getAnnotation(JsonDateFormat.class).value());
}

并且我已将 @JacksonAnnotation 添加到我创建的新注释 JsonDateFormat 中:

@Retention(RetentionPolicy.RUNTIME)
@JacksonAnnotation
public @interface JsonDateFormat {
String value();
}

最佳答案

如果您不能使用 @JsonFormat来自 Jackson 2,我建议您引入您自己的自定义注释,其中将包含格式字段。然后,您的序列化器应实现 ContextualSerializer 接口(interface)以访问注释值。

这里是 Jackson 1.9.X 的例子:

public class JacksonDateFormat {
@Retention(RetentionPolicy.RUNTIME)
public static @interface MyJsonFormat {
String value();
}

public static class Bean {
@MyJsonFormat("dd.MM.yyyy") @JsonSerialize(using = MyDateSerializer.class)
public final Date date1;

@MyJsonFormat("yyyy-MM-dd") @JsonSerialize(using = MyDateSerializer.class)
public final Date date2;

public Bean(final Date date1, final Date date2) {
this.date1 = date1;
this.date2 = date2;
}
}

public static class MyDateSerializer extends JsonSerializer<Date>
implements ContextualSerializer {
private final String format;

private MyDateSerializer(final String format) {this.format = format;}

public MyDateSerializer() {this.format = null;}

@Override
public void serialize(
final Date value, final JsonGenerator jgen, final SerializerProvider provider)
throws IOException {
jgen.writeString(new SimpleDateFormat(format).format(value));
}

@Override
public JsonSerializer createContextual(
final SerializationConfig serializationConfig, final BeanProperty beanProperty)
throws JsonMappingException {
final AnnotatedElement annotated = beanProperty.getMember().getAnnotated();
return new MyDateSerializer(annotated.getAnnotation(MyJsonFormat.class).value());
}
}

public static void main(String[] args) throws IOException {
final ObjectMapper mapper = new ObjectMapper();
final Bean value = new Bean(new Date(), new Date());
System.out.println(mapper
.writerWithDefaultPrettyPrinter()
.writeValueAsString(value));
}
}

输出:

{
"date1" : "02.12.2014",
"date2" : "2014-12-02"
}

如果您有权访问 ObjectMapper,您可以为所有 Date 类型注册您的自定义序列化程序,因此您需要更长的时间来放置 @JsonSerialize注释。

这是一个例子:

final ObjectMapper mapper = new ObjectMapper();
final SimpleModule module = new SimpleModule("", Version.unknownVersion());
module.addSerializer(Date.class, new MyDateSerializer(null));
mapper.registerModule(module);

关于java - jackson 自定义日期序列化程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27247767/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com