当然,有一种称为序列化和反序列化的自动方式,您可以使用pb2q中提到的特定注释(@ JsonSerialize,@ JsonDeserialize)来定义它。
您可以同时使用java.util.Date和java.util.Calendar......也可能是JodaTime。
在反序列化过程中,@ JsonFormat注释对我不起作用(它已将时区调整为不同的值)(序列化工作完美):
@JsonFormat(locale = "hu", shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm", timezone = "CET")
@JsonFormat(locale = "hu", shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm", timezone = "Europe/Budapest")
如果您想要预测结果,则需要使用自定义序列化器和自定义反序列化器而不是@JsonFormat注释。 我在这里找到了很好的教程和解决方案[http://www.baeldung.com/jackson-serialize-dates]
日期字段有一些示例,但我需要日历字段,所以这是我的实现:
序列化程序类:
public class CustomCalendarSerializer extends JsonSerializer {
public static final SimpleDateFormat FORMATTER = new SimpleDateFormat("yyyy-MM-dd HH:mm");
public static final Locale LOCALE_HUNGARIAN = new Locale("hu", "HU");
public static final TimeZone LOCAL_TIME_ZONE = TimeZone.getTimeZone("Europe/Budapest");
@Override
public void serialize(Calendar value, JsonGenerator gen, SerializerProvider arg2)
throws IOException, JsonProcessingException {
if (value == null) {
gen.writeNull();
} else {
gen.writeString(FORMATTER.format(value.getTime()));
}
}
}
反序列化器类:
public class CustomCalendarDeserializer extends JsonDeserializer {
@Override
public Calendar deserialize(JsonParser jsonparser, DeserializationContext context)
throws IOException, JsonProcessingException {
String dateAsString = jsonparser.getText();
try {
Date date = CustomCalendarSerializer.FORMATTER.parse(dateAsString);
Calendar calendar = Calendar.getInstance(
CustomCalendarSerializer.LOCAL_TIME_ZONE,
CustomCalendarSerializer.LOCALE_HUNGARIAN
);
calendar.setTime(date);
return calendar;
} catch (ParseException e) {
throw new RuntimeException(e);
}
}
}
以及上述类的用法:
public class CalendarEntry {
@JsonSerialize(using = CustomCalendarSerializer.class)
@JsonDeserialize(using = CustomCalendarDeserializer.class)
private Calendar calendar;
// ... additional things ...
}
使用此实现,序列化和反序列化过程的执行连续产生原始值。
只使用@JsonFormat注释反序列化给出了不同的结果我认为因为库内部时区默认设置你不能用注释参数改变(这是我对Jackson库2.5.3和2.6.3版本的体验)。