我正在与以不同标准发送日期的第三方WS集成。 例如消息正文:
{
"date" : "2016-09-12T16:00:00+0000"
}
通过使用以下配置,jackson能够很好地将其反序列化为POJO:
public class Pojo {
@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ssZ")
ZonedDateTime date;
public ZonedDateTime getDate() {
return date;
}
public void setDate(ZonedDateTime date) {
this.date = date;
}
}
我的问题是我希望从一种模式反序列化date
,然后将其序列化为我们系统使用的模式。我知道我可以在我的代码中分解映射和反序列化,但也许有更简洁的方法?
答案 0 :(得分:1)
您可以专门使用@JsonDeserialize
和@JsonSerialize
,并提供扩展StdSerializer
/ StdDeserializer
的自定义序列化程序/反序列化程序。必须覆盖每个serialize
和deserialize
方法。举个例子:
// Field
@JsonSerialize(using = CustomDateSerializer)
@JsonDeserialize(using = CustomDateDeserializer)
ZonedDateTime date
CustomDateSerializer
:
class CustomDateSerializer extends StdSerializer<ZonedDateTime> {
private static DateTimeFormatter formatter =
DateTimeFormatter.ofPattern("dd-MM-yyyy hh:mm:ss")
public CustomDateSerializer(Class<ZonedDateTime> t) {
super(t)
}
@Override
public void serialize(Date value, JsonGenerator gen, SerializerProvider arg2)
throws IOException, JsonProcessingException {
gen.writeString(formatter.format(value))
}
}
同样,deserialization
:
class CustomDateDeserializer extends StdDeserializer<ZonedDateTime> {
private static DateTimeFormatter formatter =
DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssZ")
public CustomDateDeserializer(Class<?> vc) {
super(vc)
}
@Override
public Date deserialize(JsonParser jsonparser, DeserializationContext context)
throws IOException, JsonProcessingException {
String date = jsonparser.getText()
try {
return ZonedDateTime.parse(formatter, date)
} catch (DateTimeParseException e) {
throw new RuntimeException(e)
}
}
}