3131import java .text .ParseException ;
3232import java .text .ParsePosition ;
3333import java .time .LocalDate ;
34+ import java .time .LocalDateTime ;
3435import java .time .OffsetDateTime ;
3536import java .time .format .DateTimeFormatter ;
37+ import java .time .format .DateTimeParseException ;
3638import java .util .Date ;
3739import java .util .Map ;
3840import okio .ByteString ;
@@ -51,6 +53,8 @@ public class JSON {
5153 private static OffsetDateTimeTypeAdapter offsetDateTimeTypeAdapter =
5254 new OffsetDateTimeTypeAdapter ();
5355 private static LocalDateTypeAdapter localDateTypeAdapter = new LocalDateTypeAdapter ();
56+ private static LocalDateTimeTypeAdapter localDateTimeTypeAdapter =
57+ new LocalDateTimeTypeAdapter ();
5458 private static ByteArrayAdapter byteArrayAdapter = new ByteArrayAdapter ();
5559
5660 @ SuppressWarnings ("unchecked" )
@@ -94,7 +98,10 @@ private static Class getClassByDiscriminator(
9498 gsonBuilder .registerTypeAdapter (java .sql .Date .class , sqlDateTypeAdapter );
9599 gsonBuilder .registerTypeAdapter (OffsetDateTime .class , offsetDateTimeTypeAdapter );
96100 gsonBuilder .registerTypeAdapter (LocalDate .class , localDateTypeAdapter );
101+ gsonBuilder .registerTypeAdapter (LocalDateTime .class , localDateTimeTypeAdapter );
97102 gsonBuilder .registerTypeAdapter (byte [].class , byteArrayAdapter );
103+ gsonBuilder .registerTypeAdapterFactory (
104+ new cloud .stackit .sdk .sfs .v1api .model .ConflictError .CustomTypeAdapterFactory ());
98105 gsonBuilder .registerTypeAdapterFactory (
99106 new cloud .stackit .sdk .sfs .v1api .model .CreateResourcePoolPayload
100107 .CustomTypeAdapterFactory ());
@@ -432,6 +439,53 @@ public LocalDate read(JsonReader in) throws IOException {
432439 }
433440 }
434441
442+ /** Gson TypeAdapter for JSR310 LocalDateTime type */
443+ public static class LocalDateTimeTypeAdapter extends TypeAdapter <LocalDateTime > {
444+
445+ private DateTimeFormatter formatter ;
446+
447+ public LocalDateTimeTypeAdapter () {
448+ this (DateTimeFormatter .ISO_LOCAL_DATE_TIME );
449+ }
450+
451+ public LocalDateTimeTypeAdapter (DateTimeFormatter formatter ) {
452+ this .formatter = formatter ;
453+ }
454+
455+ public void setFormat (DateTimeFormatter dateFormat ) {
456+ this .formatter = dateFormat ;
457+ }
458+
459+ @ Override
460+ public void write (JsonWriter out , LocalDateTime date ) throws IOException {
461+ if (date == null ) {
462+ out .nullValue ();
463+ } else {
464+ out .value (formatter .format (date ));
465+ }
466+ }
467+
468+ @ Override
469+ public LocalDateTime read (JsonReader in ) throws IOException {
470+ switch (in .peek ()) {
471+ case NULL :
472+ in .nextNull ();
473+ return null ;
474+ default :
475+ String date = in .nextString ();
476+ try {
477+ return LocalDateTime .parse (date , formatter );
478+ } catch (DateTimeParseException e ) {
479+ if (date .length () > 10 && date .charAt (10 ) == ' ' ) {
480+ date = date .substring (0 , 10 ) + 'T' + date .substring (11 );
481+ return LocalDateTime .parse (date , formatter );
482+ }
483+ throw e ;
484+ }
485+ }
486+ }
487+ }
488+
435489 public static void setOffsetDateTimeFormat (DateTimeFormatter dateFormat ) {
436490 offsetDateTimeTypeAdapter .setFormat (dateFormat );
437491 }
@@ -440,6 +494,10 @@ public static void setLocalDateFormat(DateTimeFormatter dateFormat) {
440494 localDateTypeAdapter .setFormat (dateFormat );
441495 }
442496
497+ public static void setLocalDateTimeFormat (DateTimeFormatter dateFormat ) {
498+ localDateTimeTypeAdapter .setFormat (dateFormat );
499+ }
500+
443501 /**
444502 * Gson TypeAdapter for java.sql.Date type If the dateFormat is null, a simple "yyyy-MM-dd"
445503 * format will be used (more efficient than SimpleDateFormat).
0 commit comments