Tentu saja ada cara otomatis yang disebut serialisasi dan deserialisasi dan Anda dapat mendefinisikannya dengan anotasi tertentu ( @JsonSerialize , @JsonDeserialize ) seperti yang disebutkan oleh pb2q juga.
Anda dapat menggunakan java.util.Date dan java.util.Calendar ... dan mungkin JodaTime juga.
Penjelasan @JsonFormat tidak berfungsi untuk saya seperti yang saya inginkan (telah menyesuaikan zona waktu dengan nilai yang berbeda) selama deserialisasi (serialisasi bekerja dengan sempurna):
@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")
Anda perlu menggunakan serializer khusus dan deserializer khusus alih-alih anotasi @JsonFormat jika Anda ingin hasil yang diprediksi. Saya telah menemukan tutorial dan solusi yang sangat bagus di sini http://www.baeldung.com/jackson-serialize-dates
Ada contoh untuk bidang Tanggal tetapi saya perlu untuk bidang Kalender jadi di sini adalah implementasi saya :
Kelas 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()));
}
}
}
Kelas 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);
}
}
}
dan penggunaan kelas-kelas di atas:
public class CalendarEntry {
@JsonSerialize(using = CustomCalendarSerializer.class)
@JsonDeserialize(using = CustomCalendarDeserializer.class)
private Calendar calendar;
// ... additional things ...
}
Dengan menggunakan implementasi ini, pelaksanaan proses serialisasi dan deserialisasi secara berurutan menghasilkan nilai asal.
Hanya menggunakan anotasi @JsonFormat deserialization memberikan hasil yang berbeda saya pikir karena pengaturan default zona waktu internal perpustakaan apa yang tidak dapat Anda ubah dengan parameter anotasi (itu adalah pengalaman saya dengan Jackson library 2.5.3 dan 2.6.3 versi juga).