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