|
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 io.kubernetes.client.openapi.models.*;
|
28 | 31 | import okio.ByteString;
|
29 | 32 |
|
|
36 | 39 | import java.time.LocalDate;
|
37 | 40 | import java.time.OffsetDateTime;
|
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;
|
|
44 | 50 | public class JSON {
|
45 | 51 | private Gson gson;
|
46 | 52 | private boolean isLenientOnJson = false;
|
| 53 | + |
| 54 | + private static final DateTimeFormatter RFC3339MICRO_FORMATTER = |
| 55 | + new DateTimeFormatterBuilder() |
| 56 | + .parseDefaulting(ChronoField.OFFSET_SECONDS, 0) |
| 57 | + .append(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss")) |
| 58 | + .optionalStart() |
| 59 | + .appendFraction(ChronoField.NANO_OF_SECOND, 6, 6, true) |
| 60 | + .optionalEnd() |
| 61 | + .appendLiteral("Z") |
| 62 | + .toFormatter(); |
| 63 | + |
47 | 64 | private DateTypeAdapter dateTypeAdapter = new DateTypeAdapter();
|
48 | 65 | private SqlDateTypeAdapter sqlDateTypeAdapter = new SqlDateTypeAdapter();
|
49 |
| - private OffsetDateTimeTypeAdapter offsetDateTimeTypeAdapter = new OffsetDateTimeTypeAdapter(); |
| 66 | + private OffsetDateTimeTypeAdapter offsetDateTimeTypeAdapter = new OffsetDateTimeTypeAdapter(RFC3339MICRO_FORMATTER); |
50 | 67 | private LocalDateTypeAdapter localDateTypeAdapter = new LocalDateTypeAdapter();
|
51 | 68 | private ByteArrayAdapter byteArrayAdapter = new ByteArrayAdapter();
|
52 | 69 |
|
53 | 70 | public static GsonBuilder createGson() {
|
54 | 71 | GsonFireBuilder fireBuilder = new GsonFireBuilder()
|
55 | 72 | ;
|
56 |
| - GsonBuilder builder = fireBuilder.createGsonBuilder(); |
57 |
| - return builder; |
| 73 | + GsonBuilder builder = |
| 74 | + fireBuilder |
| 75 | + .registerPreProcessor(V1Status.class, new V1StatusPreProcessor()) |
| 76 | + .createGsonBuilder(); |
| 77 | + return builder.setExclusionStrategies(new V1MetadataExclusionStrategy()); |
58 | 78 | }
|
59 | 79 |
|
60 | 80 | private static String getDiscriminatorValue(JsonElement readElement, String discriminatorField) {
|
@@ -162,11 +182,14 @@ public class ByteArrayAdapter extends TypeAdapter<byte[]> {
|
162 | 182 |
|
163 | 183 | @Override
|
164 | 184 | public void write(JsonWriter out, byte[] value) throws IOException {
|
| 185 | + boolean oldHtmlSafe = out.isHtmlSafe(); |
| 186 | + out.setHtmlSafe(false); |
165 | 187 | if (value == null) {
|
166 | 188 | out.nullValue();
|
167 | 189 | } else {
|
168 | 190 | out.value(ByteString.of(value).base64());
|
169 | 191 | }
|
| 192 | + out.setHtmlSafe(oldHtmlSafe); |
170 | 193 | }
|
171 | 194 |
|
172 | 195 | @Override
|
@@ -222,7 +245,12 @@ public OffsetDateTime read(JsonReader in) throws IOException {
|
222 | 245 | if (date.endsWith("+0000")) {
|
223 | 246 | date = date.substring(0, date.length()-5) + "Z";
|
224 | 247 | }
|
225 |
| - return OffsetDateTime.parse(date, formatter); |
| 248 | + try { |
| 249 | + return OffsetDateTime.parse(date, formatter); |
| 250 | + } catch (DateTimeParseException e) { |
| 251 | + // backward-compatibility for ISO8601 timestamp format |
| 252 | + return OffsetDateTime.parse(date, DateTimeFormatter.ISO_OFFSET_DATE_TIME); |
| 253 | + } |
226 | 254 | }
|
227 | 255 | }
|
228 | 256 | }
|
|
0 commit comments