Rabbit-R1/switch port/java/sources/com/google/gson/Gson.java
2024-05-21 17:08:36 -04:00

604 lines
25 KiB
Java

package com.google.gson;
import com.google.gson.internal.ConstructorConstructor;
import com.google.gson.internal.Excluder;
import com.google.gson.internal.Primitives;
import com.google.gson.internal.Streams;
import com.google.gson.internal.bind.ArrayTypeAdapter;
import com.google.gson.internal.bind.CollectionTypeAdapterFactory;
import com.google.gson.internal.bind.DateTypeAdapter;
import com.google.gson.internal.bind.JsonAdapterAnnotationTypeAdapterFactory;
import com.google.gson.internal.bind.JsonTreeReader;
import com.google.gson.internal.bind.JsonTreeWriter;
import com.google.gson.internal.bind.MapTypeAdapterFactory;
import com.google.gson.internal.bind.ObjectTypeAdapter;
import com.google.gson.internal.bind.ReflectiveTypeAdapterFactory;
import com.google.gson.internal.bind.SqlDateTypeAdapter;
import com.google.gson.internal.bind.TimeTypeAdapter;
import com.google.gson.internal.bind.TypeAdapters;
import com.google.gson.reflect.TypeToken;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonToken;
import com.google.gson.stream.JsonWriter;
import com.google.gson.stream.MalformedJsonException;
import java.io.EOFException;
import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;
import java.io.StringWriter;
import java.io.Writer;
import java.lang.reflect.Type;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicLong;
import java.util.concurrent.atomic.AtomicLongArray;
/* loaded from: classes3.dex */
public final class Gson {
static final boolean DEFAULT_COMPLEX_MAP_KEYS = false;
static final boolean DEFAULT_ESCAPE_HTML = true;
static final boolean DEFAULT_JSON_NON_EXECUTABLE = false;
static final boolean DEFAULT_LENIENT = false;
static final boolean DEFAULT_PRETTY_PRINT = false;
static final boolean DEFAULT_SERIALIZE_NULLS = false;
static final boolean DEFAULT_SPECIALIZE_FLOAT_VALUES = false;
private static final String JSON_NON_EXECUTABLE_PREFIX = ")]}'\n";
private static final TypeToken<?> NULL_KEY_SURROGATE = TypeToken.get(Object.class);
final List<TypeAdapterFactory> builderFactories;
final List<TypeAdapterFactory> builderHierarchyFactories;
private final ThreadLocal<Map<TypeToken<?>, FutureTypeAdapter<?>>> calls;
final boolean complexMapKeySerialization;
private final ConstructorConstructor constructorConstructor;
final String datePattern;
final int dateStyle;
final Excluder excluder;
final List<TypeAdapterFactory> factories;
final FieldNamingStrategy fieldNamingStrategy;
final boolean generateNonExecutableJson;
final boolean htmlSafe;
final Map<Type, InstanceCreator<?>> instanceCreators;
private final JsonAdapterAnnotationTypeAdapterFactory jsonAdapterFactory;
final boolean lenient;
final LongSerializationPolicy longSerializationPolicy;
final boolean prettyPrinting;
final boolean serializeNulls;
final boolean serializeSpecialFloatingPointValues;
final int timeStyle;
private final Map<TypeToken<?>, TypeAdapter<?>> typeTokenCache;
public Excluder excluder() {
return this.excluder;
}
public FieldNamingStrategy fieldNamingStrategy() {
return this.fieldNamingStrategy;
}
public boolean htmlSafe() {
return this.htmlSafe;
}
public boolean serializeNulls() {
return this.serializeNulls;
}
public Gson() {
this(Excluder.DEFAULT, FieldNamingPolicy.IDENTITY, Collections.emptyMap(), false, false, false, true, false, false, false, LongSerializationPolicy.DEFAULT, null, 2, 2, Collections.emptyList(), Collections.emptyList(), Collections.emptyList());
}
/* JADX INFO: Access modifiers changed from: package-private */
public Gson(Excluder excluder, FieldNamingStrategy fieldNamingStrategy, Map<Type, InstanceCreator<?>> map, boolean z, boolean z2, boolean z3, boolean z4, boolean z5, boolean z6, boolean z7, LongSerializationPolicy longSerializationPolicy, String str, int i, int i2, List<TypeAdapterFactory> list, List<TypeAdapterFactory> list2, List<TypeAdapterFactory> list3) {
this.calls = new ThreadLocal<>();
this.typeTokenCache = new ConcurrentHashMap();
this.excluder = excluder;
this.fieldNamingStrategy = fieldNamingStrategy;
this.instanceCreators = map;
ConstructorConstructor constructorConstructor = new ConstructorConstructor(map);
this.constructorConstructor = constructorConstructor;
this.serializeNulls = z;
this.complexMapKeySerialization = z2;
this.generateNonExecutableJson = z3;
this.htmlSafe = z4;
this.prettyPrinting = z5;
this.lenient = z6;
this.serializeSpecialFloatingPointValues = z7;
this.longSerializationPolicy = longSerializationPolicy;
this.datePattern = str;
this.dateStyle = i;
this.timeStyle = i2;
this.builderFactories = list;
this.builderHierarchyFactories = list2;
ArrayList arrayList = new ArrayList();
arrayList.add(TypeAdapters.JSON_ELEMENT_FACTORY);
arrayList.add(ObjectTypeAdapter.FACTORY);
arrayList.add(excluder);
arrayList.addAll(list3);
arrayList.add(TypeAdapters.STRING_FACTORY);
arrayList.add(TypeAdapters.INTEGER_FACTORY);
arrayList.add(TypeAdapters.BOOLEAN_FACTORY);
arrayList.add(TypeAdapters.BYTE_FACTORY);
arrayList.add(TypeAdapters.SHORT_FACTORY);
TypeAdapter<Number> longAdapter = longAdapter(longSerializationPolicy);
arrayList.add(TypeAdapters.newFactory(Long.TYPE, Long.class, longAdapter));
arrayList.add(TypeAdapters.newFactory(Double.TYPE, Double.class, doubleAdapter(z7)));
arrayList.add(TypeAdapters.newFactory(Float.TYPE, Float.class, floatAdapter(z7)));
arrayList.add(TypeAdapters.NUMBER_FACTORY);
arrayList.add(TypeAdapters.ATOMIC_INTEGER_FACTORY);
arrayList.add(TypeAdapters.ATOMIC_BOOLEAN_FACTORY);
arrayList.add(TypeAdapters.newFactory(AtomicLong.class, atomicLongAdapter(longAdapter)));
arrayList.add(TypeAdapters.newFactory(AtomicLongArray.class, atomicLongArrayAdapter(longAdapter)));
arrayList.add(TypeAdapters.ATOMIC_INTEGER_ARRAY_FACTORY);
arrayList.add(TypeAdapters.CHARACTER_FACTORY);
arrayList.add(TypeAdapters.STRING_BUILDER_FACTORY);
arrayList.add(TypeAdapters.STRING_BUFFER_FACTORY);
arrayList.add(TypeAdapters.newFactory(BigDecimal.class, TypeAdapters.BIG_DECIMAL));
arrayList.add(TypeAdapters.newFactory(BigInteger.class, TypeAdapters.BIG_INTEGER));
arrayList.add(TypeAdapters.URL_FACTORY);
arrayList.add(TypeAdapters.URI_FACTORY);
arrayList.add(TypeAdapters.UUID_FACTORY);
arrayList.add(TypeAdapters.CURRENCY_FACTORY);
arrayList.add(TypeAdapters.LOCALE_FACTORY);
arrayList.add(TypeAdapters.INET_ADDRESS_FACTORY);
arrayList.add(TypeAdapters.BIT_SET_FACTORY);
arrayList.add(DateTypeAdapter.FACTORY);
arrayList.add(TypeAdapters.CALENDAR_FACTORY);
arrayList.add(TimeTypeAdapter.FACTORY);
arrayList.add(SqlDateTypeAdapter.FACTORY);
arrayList.add(TypeAdapters.TIMESTAMP_FACTORY);
arrayList.add(ArrayTypeAdapter.FACTORY);
arrayList.add(TypeAdapters.CLASS_FACTORY);
arrayList.add(new CollectionTypeAdapterFactory(constructorConstructor));
arrayList.add(new MapTypeAdapterFactory(constructorConstructor, z2));
JsonAdapterAnnotationTypeAdapterFactory jsonAdapterAnnotationTypeAdapterFactory = new JsonAdapterAnnotationTypeAdapterFactory(constructorConstructor);
this.jsonAdapterFactory = jsonAdapterAnnotationTypeAdapterFactory;
arrayList.add(jsonAdapterAnnotationTypeAdapterFactory);
arrayList.add(TypeAdapters.ENUM_FACTORY);
arrayList.add(new ReflectiveTypeAdapterFactory(constructorConstructor, fieldNamingStrategy, excluder, jsonAdapterAnnotationTypeAdapterFactory));
this.factories = Collections.unmodifiableList(arrayList);
}
public GsonBuilder newBuilder() {
return new GsonBuilder(this);
}
private TypeAdapter<Number> doubleAdapter(boolean z) {
if (z) {
return TypeAdapters.DOUBLE;
}
return new TypeAdapter<Number>() { // from class: com.google.gson.Gson.1
@Override // com.google.gson.TypeAdapter
public Number read(JsonReader jsonReader) throws IOException {
if (jsonReader.peek() == JsonToken.NULL) {
jsonReader.nextNull();
return null;
}
return Double.valueOf(jsonReader.nextDouble());
}
@Override // com.google.gson.TypeAdapter
public void write(JsonWriter jsonWriter, Number number) throws IOException {
if (number == null) {
jsonWriter.nullValue();
} else {
Gson.checkValidFloatingPoint(number.doubleValue());
jsonWriter.value(number);
}
}
};
}
private TypeAdapter<Number> floatAdapter(boolean z) {
if (z) {
return TypeAdapters.FLOAT;
}
return new TypeAdapter<Number>() { // from class: com.google.gson.Gson.2
@Override // com.google.gson.TypeAdapter
public Number read(JsonReader jsonReader) throws IOException {
if (jsonReader.peek() == JsonToken.NULL) {
jsonReader.nextNull();
return null;
}
return Float.valueOf((float) jsonReader.nextDouble());
}
@Override // com.google.gson.TypeAdapter
public void write(JsonWriter jsonWriter, Number number) throws IOException {
if (number == null) {
jsonWriter.nullValue();
} else {
Gson.checkValidFloatingPoint(number.floatValue());
jsonWriter.value(number);
}
}
};
}
static void checkValidFloatingPoint(double d) {
if (Double.isNaN(d) || Double.isInfinite(d)) {
throw new IllegalArgumentException(d + " is not a valid double value as per JSON specification. To override this behavior, use GsonBuilder.serializeSpecialFloatingPointValues() method.");
}
}
private static TypeAdapter<Number> longAdapter(LongSerializationPolicy longSerializationPolicy) {
if (longSerializationPolicy == LongSerializationPolicy.DEFAULT) {
return TypeAdapters.LONG;
}
return new TypeAdapter<Number>() { // from class: com.google.gson.Gson.3
/* JADX WARN: Can't rename method to resolve collision */
@Override // com.google.gson.TypeAdapter
public Number read(JsonReader jsonReader) throws IOException {
if (jsonReader.peek() == JsonToken.NULL) {
jsonReader.nextNull();
return null;
}
return Long.valueOf(jsonReader.nextLong());
}
@Override // com.google.gson.TypeAdapter
public void write(JsonWriter jsonWriter, Number number) throws IOException {
if (number == null) {
jsonWriter.nullValue();
} else {
jsonWriter.value(number.toString());
}
}
};
}
private static TypeAdapter<AtomicLong> atomicLongAdapter(final TypeAdapter<Number> typeAdapter) {
return new TypeAdapter<AtomicLong>() { // from class: com.google.gson.Gson.4
@Override // com.google.gson.TypeAdapter
public void write(JsonWriter jsonWriter, AtomicLong atomicLong) throws IOException {
TypeAdapter.this.write(jsonWriter, Long.valueOf(atomicLong.get()));
}
@Override // com.google.gson.TypeAdapter
public AtomicLong read(JsonReader jsonReader) throws IOException {
return new AtomicLong(((Number) TypeAdapter.this.read(jsonReader)).longValue());
}
}.nullSafe();
}
private static TypeAdapter<AtomicLongArray> atomicLongArrayAdapter(final TypeAdapter<Number> typeAdapter) {
return new TypeAdapter<AtomicLongArray>() { // from class: com.google.gson.Gson.5
@Override // com.google.gson.TypeAdapter
public void write(JsonWriter jsonWriter, AtomicLongArray atomicLongArray) throws IOException {
jsonWriter.beginArray();
int length = atomicLongArray.length();
for (int i = 0; i < length; i++) {
TypeAdapter.this.write(jsonWriter, Long.valueOf(atomicLongArray.get(i)));
}
jsonWriter.endArray();
}
@Override // com.google.gson.TypeAdapter
public AtomicLongArray read(JsonReader jsonReader) throws IOException {
ArrayList arrayList = new ArrayList();
jsonReader.beginArray();
while (jsonReader.hasNext()) {
arrayList.add(Long.valueOf(((Number) TypeAdapter.this.read(jsonReader)).longValue()));
}
jsonReader.endArray();
int size = arrayList.size();
AtomicLongArray atomicLongArray = new AtomicLongArray(size);
for (int i = 0; i < size; i++) {
atomicLongArray.set(i, ((Long) arrayList.get(i)).longValue());
}
return atomicLongArray;
}
}.nullSafe();
}
public <T> TypeAdapter<T> getAdapter(TypeToken<T> typeToken) {
boolean z;
TypeAdapter<T> typeAdapter = (TypeAdapter) this.typeTokenCache.get(typeToken == null ? NULL_KEY_SURROGATE : typeToken);
if (typeAdapter != null) {
return typeAdapter;
}
Map<TypeToken<?>, FutureTypeAdapter<?>> map = this.calls.get();
if (map == null) {
map = new HashMap<>();
this.calls.set(map);
z = true;
} else {
z = false;
}
FutureTypeAdapter<?> futureTypeAdapter = map.get(typeToken);
if (futureTypeAdapter != null) {
return futureTypeAdapter;
}
try {
FutureTypeAdapter<?> futureTypeAdapter2 = new FutureTypeAdapter<>();
map.put(typeToken, futureTypeAdapter2);
Iterator<TypeAdapterFactory> it = this.factories.iterator();
while (it.hasNext()) {
TypeAdapter<T> create = it.next().create(this, typeToken);
if (create != null) {
futureTypeAdapter2.setDelegate(create);
this.typeTokenCache.put(typeToken, create);
return create;
}
}
throw new IllegalArgumentException("GSON (2.8.8) cannot handle " + typeToken);
} finally {
map.remove(typeToken);
if (z) {
this.calls.remove();
}
}
}
public <T> TypeAdapter<T> getDelegateAdapter(TypeAdapterFactory typeAdapterFactory, TypeToken<T> typeToken) {
if (!this.factories.contains(typeAdapterFactory)) {
typeAdapterFactory = this.jsonAdapterFactory;
}
boolean z = false;
for (TypeAdapterFactory typeAdapterFactory2 : this.factories) {
if (z) {
TypeAdapter<T> create = typeAdapterFactory2.create(this, typeToken);
if (create != null) {
return create;
}
} else if (typeAdapterFactory2 == typeAdapterFactory) {
z = true;
}
}
throw new IllegalArgumentException("GSON cannot serialize " + typeToken);
}
public <T> TypeAdapter<T> getAdapter(Class<T> cls) {
return getAdapter(TypeToken.get((Class) cls));
}
public JsonElement toJsonTree(Object obj) {
if (obj == null) {
return JsonNull.INSTANCE;
}
return toJsonTree(obj, obj.getClass());
}
public JsonElement toJsonTree(Object obj, Type type) {
JsonTreeWriter jsonTreeWriter = new JsonTreeWriter();
toJson(obj, type, jsonTreeWriter);
return jsonTreeWriter.get();
}
public String toJson(Object obj) {
if (obj == null) {
return toJson((JsonElement) JsonNull.INSTANCE);
}
return toJson(obj, obj.getClass());
}
public String toJson(Object obj, Type type) {
StringWriter stringWriter = new StringWriter();
toJson(obj, type, stringWriter);
return stringWriter.toString();
}
public void toJson(Object obj, Appendable appendable) throws JsonIOException {
if (obj != null) {
toJson(obj, obj.getClass(), appendable);
} else {
toJson((JsonElement) JsonNull.INSTANCE, appendable);
}
}
public void toJson(Object obj, Type type, Appendable appendable) throws JsonIOException {
try {
toJson(obj, type, newJsonWriter(Streams.writerForAppendable(appendable)));
} catch (IOException e) {
throw new JsonIOException(e);
}
}
public void toJson(Object obj, Type type, JsonWriter jsonWriter) throws JsonIOException {
TypeAdapter adapter = getAdapter(TypeToken.get(type));
boolean isLenient = jsonWriter.isLenient();
jsonWriter.setLenient(true);
boolean isHtmlSafe = jsonWriter.isHtmlSafe();
jsonWriter.setHtmlSafe(this.htmlSafe);
boolean serializeNulls = jsonWriter.getSerializeNulls();
jsonWriter.setSerializeNulls(this.serializeNulls);
try {
try {
try {
adapter.write(jsonWriter, obj);
} catch (AssertionError e) {
AssertionError assertionError = new AssertionError("AssertionError (GSON 2.8.8): " + e.getMessage());
assertionError.initCause(e);
throw assertionError;
}
} catch (IOException e2) {
throw new JsonIOException(e2);
}
} finally {
jsonWriter.setLenient(isLenient);
jsonWriter.setHtmlSafe(isHtmlSafe);
jsonWriter.setSerializeNulls(serializeNulls);
}
}
public String toJson(JsonElement jsonElement) {
StringWriter stringWriter = new StringWriter();
toJson(jsonElement, (Appendable) stringWriter);
return stringWriter.toString();
}
public void toJson(JsonElement jsonElement, Appendable appendable) throws JsonIOException {
try {
toJson(jsonElement, newJsonWriter(Streams.writerForAppendable(appendable)));
} catch (IOException e) {
throw new JsonIOException(e);
}
}
public JsonWriter newJsonWriter(Writer writer) throws IOException {
if (this.generateNonExecutableJson) {
writer.write(JSON_NON_EXECUTABLE_PREFIX);
}
JsonWriter jsonWriter = new JsonWriter(writer);
if (this.prettyPrinting) {
jsonWriter.setIndent(" ");
}
jsonWriter.setSerializeNulls(this.serializeNulls);
return jsonWriter;
}
public JsonReader newJsonReader(Reader reader) {
JsonReader jsonReader = new JsonReader(reader);
jsonReader.setLenient(this.lenient);
return jsonReader;
}
public void toJson(JsonElement jsonElement, JsonWriter jsonWriter) throws JsonIOException {
boolean isLenient = jsonWriter.isLenient();
jsonWriter.setLenient(true);
boolean isHtmlSafe = jsonWriter.isHtmlSafe();
jsonWriter.setHtmlSafe(this.htmlSafe);
boolean serializeNulls = jsonWriter.getSerializeNulls();
jsonWriter.setSerializeNulls(this.serializeNulls);
try {
try {
Streams.write(jsonElement, jsonWriter);
} catch (IOException e) {
throw new JsonIOException(e);
} catch (AssertionError e2) {
AssertionError assertionError = new AssertionError("AssertionError (GSON 2.8.8): " + e2.getMessage());
assertionError.initCause(e2);
throw assertionError;
}
} finally {
jsonWriter.setLenient(isLenient);
jsonWriter.setHtmlSafe(isHtmlSafe);
jsonWriter.setSerializeNulls(serializeNulls);
}
}
public <T> T fromJson(String str, Class<T> cls) throws JsonSyntaxException {
return (T) Primitives.wrap(cls).cast(fromJson(str, (Type) cls));
}
public <T> T fromJson(String str, Type type) throws JsonSyntaxException {
if (str == null) {
return null;
}
return (T) fromJson(new StringReader(str), type);
}
public <T> T fromJson(Reader reader, Class<T> cls) throws JsonSyntaxException, JsonIOException {
JsonReader newJsonReader = newJsonReader(reader);
Object fromJson = fromJson(newJsonReader, cls);
assertFullConsumption(fromJson, newJsonReader);
return (T) Primitives.wrap(cls).cast(fromJson);
}
public <T> T fromJson(Reader reader, Type type) throws JsonIOException, JsonSyntaxException {
JsonReader newJsonReader = newJsonReader(reader);
T t = (T) fromJson(newJsonReader, type);
assertFullConsumption(t, newJsonReader);
return t;
}
private static void assertFullConsumption(Object obj, JsonReader jsonReader) {
if (obj != null) {
try {
if (jsonReader.peek() == JsonToken.END_DOCUMENT) {
} else {
throw new JsonIOException("JSON document was not fully consumed.");
}
} catch (MalformedJsonException e) {
throw new JsonSyntaxException(e);
} catch (IOException e2) {
throw new JsonIOException(e2);
}
}
}
public <T> T fromJson(JsonReader jsonReader, Type type) throws JsonIOException, JsonSyntaxException {
boolean isLenient = jsonReader.isLenient();
boolean z = true;
jsonReader.setLenient(true);
try {
try {
try {
jsonReader.peek();
z = false;
return getAdapter(TypeToken.get(type)).read(jsonReader);
} catch (EOFException e) {
if (!z) {
throw new JsonSyntaxException(e);
}
jsonReader.setLenient(isLenient);
return null;
} catch (IllegalStateException e2) {
throw new JsonSyntaxException(e2);
}
} catch (IOException e3) {
throw new JsonSyntaxException(e3);
} catch (AssertionError e4) {
AssertionError assertionError = new AssertionError("AssertionError (GSON 2.8.8): " + e4.getMessage());
assertionError.initCause(e4);
throw assertionError;
}
} finally {
jsonReader.setLenient(isLenient);
}
}
public <T> T fromJson(JsonElement jsonElement, Class<T> cls) throws JsonSyntaxException {
return (T) Primitives.wrap(cls).cast(fromJson(jsonElement, (Type) cls));
}
public <T> T fromJson(JsonElement jsonElement, Type type) throws JsonSyntaxException {
if (jsonElement == null) {
return null;
}
return (T) fromJson(new JsonTreeReader(jsonElement), type);
}
/* JADX INFO: Access modifiers changed from: package-private */
/* loaded from: classes3.dex */
public static class FutureTypeAdapter<T> extends TypeAdapter<T> {
private TypeAdapter<T> delegate;
FutureTypeAdapter() {
}
public void setDelegate(TypeAdapter<T> typeAdapter) {
if (this.delegate != null) {
throw new AssertionError();
}
this.delegate = typeAdapter;
}
@Override // com.google.gson.TypeAdapter
public T read(JsonReader jsonReader) throws IOException {
TypeAdapter<T> typeAdapter = this.delegate;
if (typeAdapter == null) {
throw new IllegalStateException();
}
return typeAdapter.read(jsonReader);
}
@Override // com.google.gson.TypeAdapter
public void write(JsonWriter jsonWriter, T t) throws IOException {
TypeAdapter<T> typeAdapter = this.delegate;
if (typeAdapter == null) {
throw new IllegalStateException();
}
typeAdapter.write(jsonWriter, t);
}
}
public String toString() {
return "{serializeNulls:" + this.serializeNulls + ",factories:" + this.factories + ",instanceCreators:" + this.constructorConstructor + "}";
}
}