2323import io .gsonfire .GsonFireBuilder ;
2424import io .gsonfire .TypeSelector ;
2525
26+ import io .kubernetes .client .gson .V1MetadataExclusionStrategy ;
27+ import io .kubernetes .client .gson .V1StatusPreProcessor ;
28+ import io .kubernetes .client .openapi .models .V1Status ;
2629import okio .ByteString ;
2730
2831import java .io .IOException ;
3538import java .time .ZoneId ;
3639import java .time .ZoneOffset ;
3740import java .time .format .DateTimeFormatter ;
41+ import java .time .format .DateTimeFormatterBuilder ;
42+ import java .time .format .DateTimeParseException ;
43+ import java .time .temporal .ChronoField ;
3844import java .util .Date ;
3945import java .util .Locale ;
4046import java .util .Map ;
5056public class JSON {
5157 private static Gson gson ;
5258 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+
5370 private static DateTypeAdapter dateTypeAdapter = new DateTypeAdapter ();
5471 private static SqlDateTypeAdapter sqlDateTypeAdapter = new SqlDateTypeAdapter ();
55- private static OffsetDateTimeTypeAdapter offsetDateTimeTypeAdapter = new OffsetDateTimeTypeAdapter ();
72+ private static OffsetDateTimeTypeAdapter offsetDateTimeTypeAdapter = new OffsetDateTimeTypeAdapter (RFC3339MICRO_FORMATTER );
5673 private static LocalDateTypeAdapter localDateTypeAdapter = new LocalDateTypeAdapter ();
5774 private static ByteArrayAdapter byteArrayAdapter = new ByteArrayAdapter ();
5875
@@ -65,8 +82,11 @@ public class JSON {
6582 public static GsonBuilder createGson () {
6683 GsonFireBuilder fireBuilder = new GsonFireBuilder ()
6784 ;
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 ());
7090 }
7191
7292 private static String getDiscriminatorValue (JsonElement readElement , String discriminatorField ) {
@@ -793,11 +813,14 @@ public static class ByteArrayAdapter extends TypeAdapter<byte[]> {
793813
794814 @ Override
795815 public void write (JsonWriter out , byte [] value ) throws IOException {
816+ boolean oldHtmlSafe = out .isHtmlSafe ();
817+ out .setHtmlSafe (false );
796818 if (value == null ) {
797819 out .nullValue ();
798820 } else {
799821 out .value (ByteString .of (value ).base64 ());
800822 }
823+ out .setHtmlSafe (oldHtmlSafe );
801824 }
802825
803826 @ Override
@@ -853,7 +876,12 @@ public OffsetDateTime read(JsonReader in) throws IOException {
853876 if (date .endsWith ("+0000" )) {
854877 date = date .substring (0 , date .length ()-5 ) + "Z" ;
855878 }
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+ }
857885 }
858886 }
859887 }
0 commit comments