Skip to content

Commit c47db7b

Browse files
eamonnmcmanusMukjepScarletMarcono1234
authored
Add type adapters for java.time classes (#2948)
* Add type adapters for `java.time` classes. These adapters essentially freeze the JSON representation that `ReflectiveTypeAdapterFactory` established by default, based on the private fields of `java.time` classes. That's not a great representation, but it is understandable. Changing it to anything else would break compatibility with systems that are expecting the current format. If Gson had been updated with `java.time` adapters at the time the `java.time` API was added, the representation would surely have been something else, probably ISO standard formats. We can still supply non-default adapters for that, but we'll still need to have these legacy adapters by default. I've been meaning to make this change for a while, but the need to do so becomes more urgent with [this JDK commit](openjdk/jdk@cc05530) which makes a number of `java.time` fields `transient`. That means that the reflective-based adapter will no longer work with the classes that were changed. * Apply a couple of Error Prone suggestions. * Reformat a couple of source files. * Fix another EP warning. * Fix a particularly annoying EP warning/error. * Update the Android API level. I think it is time to do this, but obviously it should be a separate PR. * Substantial rework. * Move the new `TypeAdapter` implementations into a new class `JavaTimeTypeAdapters`. This allows us to omit that class from Android builds where it otherwise triggers warnings about SDK levels. * Ensure that every `java.time` class that needs a `TypeAdapter` has one. This doesn't include "subpackages" `java.time.*` like `java.time.chrono`, where it doesn't appear that there are any classes that are likely to be serialized to JSON. * Fix the handling of `ZoneId` and its subclasses. * refactor: slightly optimize ConstructorConstructor (#2950) * refactor: slightly optimize ConstructorConstructor * Update comments Co-authored-by: Marcono1234 <Marcono1234@users.noreply.github.com> * spotless apply Co-authored-by: Marcono1234 <Marcono1234@users.noreply.github.com> --------- Co-authored-by: Marcono1234 <Marcono1234@users.noreply.github.com> * Fix outdated comment (#2954) * Compilation fixes. I copied the internal version that was running on Google's infrastructure, and some adjustments were needed. * Fix lint errors. * Fix a particularly annoying lint error. * Fix the fix. * Further fixes. This still doesn't pass with a local build, and I may need to debug an OSGi problem. * Revert to Android API 23, but with gummy-bears-api. * Annotate `JavaTimeTypeAdapters` to suppress animal-sniffer errors. * Update `OSGiManifestIT` not to depend on order. It appears that sometimes the clauses being checked for appear in the other order, possibly because of a `HashMap` or the like somewhere in the guts of OSGi. I haven't seen this on GitHub, but I do see it when running locally with Google's JDK, which has more hash randomization. * Fix use of assignment expression. * Remove the parser, which was overkill. It's enough just to swap the two clauses of a line when they are not in the expected order. Also, unrelatedly, update `protobuf-maven-plugin`. * Use a local `@IgnoreJRERequirement`. * Configure the local animal-sniffer annotation. * Suppress IdentifierName warning. * Update comments and undo an unnecessary split. * Restore Math.toIntExact. --------- Co-authored-by: 木葉 Scarlet <93977077+MukjepScarlet@users.noreply.github.com> Co-authored-by: Marcono1234 <Marcono1234@users.noreply.github.com>
1 parent dfc1ce0 commit c47db7b

File tree

6 files changed

+811
-73
lines changed

6 files changed

+811
-73
lines changed

gson/src/main/java/com/google/gson/Gson.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -370,6 +370,10 @@ public Gson() {
370370
factories.add(TypeAdapters.BIT_SET_FACTORY);
371371
factories.add(DefaultDateTypeAdapter.DEFAULT_STYLE_FACTORY);
372372
factories.add(TypeAdapters.CALENDAR_FACTORY);
373+
TypeAdapterFactory javaTimeFactory = TypeAdapters.javaTimeTypeAdapterFactory();
374+
if (javaTimeFactory != null) {
375+
factories.add(javaTimeFactory);
376+
}
373377

374378
if (SqlTypesSupport.SUPPORTS_SQL_TYPES) {
375379
factories.add(SqlTypesSupport.TIME_FACTORY);
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package com.google.gson.internal.bind;
2+
3+
import java.lang.annotation.ElementType;
4+
import java.lang.annotation.Retention;
5+
import java.lang.annotation.RetentionPolicy;
6+
import java.lang.annotation.Target;
7+
8+
@Retention(RetentionPolicy.CLASS)
9+
@Target({ElementType.METHOD, ElementType.CONSTRUCTOR, ElementType.TYPE, ElementType.FIELD})
10+
@SuppressWarnings("IdentifierName")
11+
@interface IgnoreJRERequirement {}

0 commit comments

Comments
 (0)