2424import io .gsonfire .GsonFireBuilder ;
2525import io .gsonfire .TypeSelector ;
2626
27+ import io .kubernetes .client .gson .V1MetadataExclusionStrategy ;
28+ import io .kubernetes .client .gson .V1StatusPreProcessor ;
29+ import io .kubernetes .client .openapi .models .V1Status ;
2730import okio .ByteString ;
2831
2932import java .io .IOException ;
3639import java .time .ZoneId ;
3740import java .time .ZoneOffset ;
3841import java .time .format .DateTimeFormatter ;
42+ import java .time .format .DateTimeFormatterBuilder ;
43+ import java .time .format .DateTimeParseException ;
44+ import java .time .temporal .ChronoField ;
3945import java .util .Date ;
4046import java .util .Locale ;
4147import java .util .Map ;
5157public class JSON {
5258 private static Gson gson ;
5359 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+
5471 private static DateTypeAdapter dateTypeAdapter = new DateTypeAdapter ();
5572 private static SqlDateTypeAdapter sqlDateTypeAdapter = new SqlDateTypeAdapter ();
56- private static OffsetDateTimeTypeAdapter offsetDateTimeTypeAdapter = new OffsetDateTimeTypeAdapter ();
73+ private static OffsetDateTimeTypeAdapter offsetDateTimeTypeAdapter = new OffsetDateTimeTypeAdapter (RFC3339MICRO_FORMATTER );
5774 private static LocalDateTypeAdapter localDateTypeAdapter = new LocalDateTypeAdapter ();
5875 private static ByteArrayAdapter byteArrayAdapter = new ByteArrayAdapter ();
5976
@@ -66,8 +83,11 @@ public class JSON {
6683 public static GsonBuilder createGson () {
6784 GsonFireBuilder fireBuilder = new GsonFireBuilder ()
6885 ;
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 ());
7191 }
7292
7393 private static String getDiscriminatorValue (JsonElement readElement , String discriminatorField ) {
@@ -797,11 +817,14 @@ public static class ByteArrayAdapter extends TypeAdapter<byte[]> {
797817
798818 @ Override
799819 public void write (JsonWriter out , byte [] value ) throws IOException {
820+ boolean oldHtmlSafe = out .isHtmlSafe ();
821+ out .setHtmlSafe (false );
800822 if (value == null ) {
801823 out .nullValue ();
802824 } else {
803825 out .value (ByteString .of (value ).base64 ());
804826 }
827+ out .setHtmlSafe (oldHtmlSafe );
805828 }
806829
807830 @ Override
@@ -857,7 +880,12 @@ public OffsetDateTime read(JsonReader in) throws IOException {
857880 if (date .endsWith ("+0000" )) {
858881 date = date .substring (0 , date .length ()-5 ) + "Z" ;
859882 }
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+ }
861889 }
862890 }
863891 }
0 commit comments