24
24
import io .gsonfire .GsonFireBuilder ;
25
25
import io .gsonfire .TypeSelector ;
26
26
27
+ import io .kubernetes .client .gson .V1MetadataExclusionStrategy ;
28
+ import io .kubernetes .client .gson .V1StatusPreProcessor ;
29
+ import io .kubernetes .client .openapi .models .V1Status ;
27
30
import okio .ByteString ;
28
31
29
32
import java .io .IOException ;
36
39
import java .time .ZoneId ;
37
40
import java .time .ZoneOffset ;
38
41
import java .time .format .DateTimeFormatter ;
42
+ import java .time .format .DateTimeFormatterBuilder ;
43
+ import java .time .format .DateTimeParseException ;
44
+ import java .time .temporal .ChronoField ;
39
45
import java .util .Date ;
40
46
import java .util .Locale ;
41
47
import java .util .Map ;
51
57
public class JSON {
52
58
private static Gson gson ;
53
59
private static boolean isLenientOnJson = false ;
60
+
61
+ private static final DateTimeFormatter RFC3339MICRO_FORMATTER =
62
+ new DateTimeFormatterBuilder ()
63
+ .parseDefaulting (ChronoField .OFFSET_SECONDS , 0 )
64
+ .append (DateTimeFormatter .ofPattern ("yyyy-MM-dd'T'HH:mm:ss" ))
65
+ .optionalStart ()
66
+ .appendFraction (ChronoField .NANO_OF_SECOND , 6 , 6 , true )
67
+ .optionalEnd ()
68
+ .appendLiteral ("Z" )
69
+ .toFormatter ();
70
+
54
71
private static DateTypeAdapter dateTypeAdapter = new DateTypeAdapter ();
55
72
private static SqlDateTypeAdapter sqlDateTypeAdapter = new SqlDateTypeAdapter ();
56
- private static OffsetDateTimeTypeAdapter offsetDateTimeTypeAdapter = new OffsetDateTimeTypeAdapter ();
73
+ private static OffsetDateTimeTypeAdapter offsetDateTimeTypeAdapter = new OffsetDateTimeTypeAdapter (RFC3339MICRO_FORMATTER );
57
74
private static LocalDateTypeAdapter localDateTypeAdapter = new LocalDateTypeAdapter ();
58
75
private static ByteArrayAdapter byteArrayAdapter = new ByteArrayAdapter ();
59
76
@@ -66,8 +83,11 @@ public class JSON {
66
83
public static GsonBuilder createGson () {
67
84
GsonFireBuilder fireBuilder = new GsonFireBuilder ()
68
85
;
69
- GsonBuilder builder = fireBuilder .createGsonBuilder ();
70
- return builder ;
86
+ GsonBuilder builder =
87
+ fireBuilder
88
+ .registerPreProcessor (V1Status .class , new V1StatusPreProcessor ())
89
+ .createGsonBuilder ();
90
+ return builder .setExclusionStrategies (new V1MetadataExclusionStrategy ());
71
91
}
72
92
73
93
private static String getDiscriminatorValue (JsonElement readElement , String discriminatorField ) {
@@ -797,11 +817,14 @@ public static class ByteArrayAdapter extends TypeAdapter<byte[]> {
797
817
798
818
@ Override
799
819
public void write (JsonWriter out , byte [] value ) throws IOException {
820
+ boolean oldHtmlSafe = out .isHtmlSafe ();
821
+ out .setHtmlSafe (false );
800
822
if (value == null ) {
801
823
out .nullValue ();
802
824
} else {
803
825
out .value (ByteString .of (value ).base64 ());
804
826
}
827
+ out .setHtmlSafe (oldHtmlSafe );
805
828
}
806
829
807
830
@ Override
@@ -857,7 +880,12 @@ public OffsetDateTime read(JsonReader in) throws IOException {
857
880
if (date .endsWith ("+0000" )) {
858
881
date = date .substring (0 , date .length ()-5 ) + "Z" ;
859
882
}
860
- return OffsetDateTime .parse (date , formatter );
883
+ try {
884
+ return OffsetDateTime .parse (date , formatter );
885
+ } catch (DateTimeParseException e ) {
886
+ // backward-compatibility for ISO8601 timestamp format
887
+ return OffsetDateTime .parse (date , DateTimeFormatter .ISO_OFFSET_DATE_TIME );
888
+ }
861
889
}
862
890
}
863
891
}
0 commit comments