我需要设置班级日期序列化的格式。我有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
@JsonSerialize(using = CDJsonDateSerializer.class, CDJsonDateSerializer.FIRST_FORMAT)。
@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(); }
如果您不能使用Jackson 2中的@JsonFormat,建议您引入自己的自定义注释,其中将包含格式字段。然后,您的Serailizer应该实现该ContextualSerializer接口以获取对注释值的访问。
ContextualSerializer
这是杰克逊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注释。
ObjectMapper
Date
这是一个例子:
final ObjectMapper mapper = new ObjectMapper(); final SimpleModule module = new SimpleModule("", Version.unknownVersion()); module.addSerializer(Date.class, new MyDateSerializer(null)); mapper.registerModule(module);