23
23
import io .gsonfire .GsonFireBuilder ;
24
24
import io .gsonfire .TypeSelector ;
25
25
26
+ import io .kubernetes .client .gson .V1StatusPreProcessor ;
27
+ import io .kubernetes .client .openapi .models .V1Status ;
26
28
import okio .ByteString ;
27
29
28
30
import java .io .IOException ;
34
36
import java .time .OffsetDateTime ;
35
37
import java .time .ZoneId ;
36
38
import java .time .ZoneOffset ;
37
- import java .time .format .DateTimeFormatter ;
39
+ import java .time .format .DateTimeFormatterBuilder ;
40
+ import java .time .format .DateTimeParseException ;
41
+ import java .time .temporal .ChronoField ;
38
42
import java .util .Date ;
39
43
import java .util .Locale ;
40
44
import java .util .Map ;
50
54
public class JSON {
51
55
private static Gson gson ;
52
56
private static boolean isLenientOnJson = false ;
57
+ private static final DateTimeFormatter RFC3339MICRO_FORMATTER =
58
+ new DateTimeFormatterBuilder ()
59
+ .parseDefaulting (ChronoField .OFFSET_SECONDS , 0 )
60
+ .append (DateTimeFormatter .ofPattern ("yyyy-MM-dd'T'HH:mm:ss" ))
61
+ .optionalStart ()
62
+ .appendFraction (ChronoField .NANO_OF_SECOND , 6 , 6 , true )
63
+ .optionalEnd ()
64
+ .appendLiteral ("Z" )
65
+ .toFormatter ();
66
+
53
67
private static DateTypeAdapter dateTypeAdapter = new DateTypeAdapter ();
54
68
private static SqlDateTypeAdapter sqlDateTypeAdapter = new SqlDateTypeAdapter ();
55
- private static OffsetDateTimeTypeAdapter offsetDateTimeTypeAdapter = new OffsetDateTimeTypeAdapter ();
69
+ private static OffsetDateTimeTypeAdapter offsetDateTimeTypeAdapter = new OffsetDateTimeTypeAdapter (RFC3339MICRO_FORMATTER );
56
70
private static LocalDateTypeAdapter localDateTypeAdapter = new LocalDateTypeAdapter ();
57
71
private static ByteArrayAdapter byteArrayAdapter = new ByteArrayAdapter ();
58
72
@@ -65,7 +79,10 @@ public class JSON {
65
79
public static GsonBuilder createGson () {
66
80
GsonFireBuilder fireBuilder = new GsonFireBuilder ()
67
81
;
68
- GsonBuilder builder = fireBuilder .createGsonBuilder ();
82
+ GsonBuilder builder =
83
+ fireBuilder
84
+ .registerPreProcessor (V1Status .class , new V1StatusPreProcessor ())
85
+ .createGsonBuilder ();
69
86
return builder ;
70
87
}
71
88
@@ -784,11 +801,15 @@ public static class ByteArrayAdapter extends TypeAdapter<byte[]> {
784
801
785
802
@ Override
786
803
public void write (JsonWriter out , byte [] value ) throws IOException {
804
+ boolean oldHtmlSafe = out .isHtmlSafe ();
805
+ out .setHtmlSafe (false );
806
+
787
807
if (value == null ) {
788
808
out .nullValue ();
789
809
} else {
790
810
out .value (ByteString .of (value ).base64 ());
791
811
}
812
+ out .setHtmlSafe (oldHtmlSafe );
792
813
}
793
814
794
815
@ Override
@@ -844,6 +865,12 @@ public OffsetDateTime read(JsonReader in) throws IOException {
844
865
if (date .endsWith ("+0000" )) {
845
866
date = date .substring (0 , date .length ()-5 ) + "Z" ;
846
867
}
868
+ try {
869
+ return OffsetDateTime .parse (date , formatter );
870
+ } catch (DateTimeParseException e ) {
871
+ // backward-compatibility for ISO8601 timestamp format
872
+ return OffsetDateTime .parse (date , DateTimeFormatter .ISO_OFFSET_DATE_TIME );
873
+ }
847
874
return OffsetDateTime .parse (date , formatter );
848
875
}
849
876
}
0 commit comments