แน่นอนว่ามีวิธีการอัตโนมัติที่เรียกว่าการทำให้เป็นอนุกรมและการดีซีเรียลไลเซชันและคุณสามารถกำหนดมันด้วยคำอธิบายประกอบที่เฉพาะเจาะจง ( @JsonSerialize , @JsonDeserialize ) ตามที่กล่าวไว้โดย pb2q เช่นกัน
คุณสามารถใช้ทั้ง 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")
คุณต้องใช้ serializer ที่กำหนดเองและ deserializer ที่กำหนดเองแทนการเพิ่มความคิดเห็น @JsonFormat ถ้าคุณต้องการผลการทำนาย ฉันได้พบกับการสอนและวิธีแก้ปัญหาที่ดีจริง ๆ ที่นี่http://www.baeldung.com/jackson-serialize-dates
มีตัวอย่างสำหรับฟิลด์Dateแต่ฉันต้องการสำหรับฟิลด์Calendarดังนั้นนี่คือการใช้งานของฉัน :
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()));
}
}
}
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);
}
}
}
และการใช้คลาสข้างต้น:
public class CalendarEntry {
@JsonSerialize(using = CustomCalendarSerializer.class)
@JsonDeserialize(using = CustomCalendarDeserializer.class)
private Calendar calendar;
// ... additional things ...
}
การใช้การใช้งานนี้การดำเนินการของกระบวนการทำให้เป็นอนุกรมและ
การใช้คำอธิบายประกอบ @JsonFormat เท่านั้นการดีซีเรียลไลซ์เซชั่นให้ผลลัพธ์ที่แตกต่างฉันคิดว่าเนื่องจากการตั้งค่าเริ่มต้นของเขตเวลาภายในของไลบรารีสิ่งที่คุณไม่สามารถเปลี่ยนแปลงได้ด้วยพารามิเตอร์คำอธิบายประกอบ (นั่นคือประสบการณ์ของฉันกับห้องสมุด