Tất nhiên, có một cách tự động gọi là tuần tự hóa và giải tuần tự hóa và bạn có thể định nghĩa nó với các chú thích cụ thể ( @JsonSerialize , @JsonDeserialize ) như được đề cập bởi pb2q.
Bạn có thể sử dụng cả java.util.Date và java.util.CalWiki ... và có thể là JodaTime.
Các chú thích @JsonFormat không hoạt động với tôi như tôi muốn (nó đã điều chỉnh múi giờ thành giá trị khác nhau) trong quá trình khử lưu huỳnh (tuần tự hóa hoạt động hoàn hảo):
@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")
Bạn cần sử dụng serializer tùy chỉnh và deserializer tùy chỉnh thay vì chú thích @JsonFormat nếu bạn muốn kết quả dự đoán. Tôi đã tìm thấy hướng dẫn và giải pháp thực sự tốt ở đây http://www.baeldung.com/jackson-serialize-dates
Có các ví dụ cho các trường Ngày nhưng tôi cần cho các trường Lịch vì vậy đây là cách triển khai của tôi :
Lớp serializer :
public class CustomCalendarSerializer extends JsonSerializer<Calendar> {
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()));
}
}
}
Lớp deserializer :
public class CustomCalendarDeserializer extends JsonDeserializer<Calendar> {
@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);
}
}
}
và việc sử dụng các lớp trên:
public class CalendarEntry {
@JsonSerialize(using = CustomCalendarSerializer.class)
@JsonDeserialize(using = CustomCalendarDeserializer.class)
private Calendar calendar;
// ... additional things ...
}
Sử dụng thực hiện này việc thực hiện quá trình tuần tự hóa và giải tuần tự hóa liên tiếp dẫn đến giá trị gốc.
Chỉ sử dụng chú thích @JsonFormat, việc khử lưu huỳnh sẽ mang lại kết quả khác vì tôi thiết lập mặc định múi giờ bên trong thư viện, điều bạn không thể thay đổi với các tham số chú thích (đó cũng là kinh nghiệm của tôi với phiên bản thư viện Jackson 2.5.3 và 2.6.3).