Search in sources :

Example 6 with TypeAdapter

use of com.google.gson.TypeAdapter in project lastaflute by lastaflute.

the class LaYourCollectionTypeAdapterFactory method create.

@Override
public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> typeToken) {
    final Type type = typeToken.getType();
    final Class<? super T> rawType = typeToken.getRawType();
    if (!yourType.isAssignableFrom(rawType)) {
        return null;
    }
    final Type elementType = LaGsonTypes.getYourCollectionElementType(type, rawType, yourType);
    final TypeAdapter<?> elementTypeAdapter = gson.getAdapter(TypeToken.get(elementType));
    // create() doesn't define a type parameter
    @SuppressWarnings({ "unchecked", "rawtypes" }) final TypeAdapter<T> result = new Adapter(gson, elementType, elementTypeAdapter);
    return result;
}
Also used : Type(java.lang.reflect.Type) TypeAdapter(com.google.gson.TypeAdapter)

Example 7 with TypeAdapter

use of com.google.gson.TypeAdapter in project maple-ir by LLVM-but-worse.

the class CollectionTypeAdapterFactory method create.

public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> typeToken) {
    Type type = typeToken.getType();
    Class<? super T> rawType = typeToken.getRawType();
    if (!Collection.class.isAssignableFrom(rawType)) {
        return null;
    }
    Type elementType = $Gson$Types.getCollectionElementType(type, rawType);
    TypeAdapter<?> elementTypeAdapter = gson.getAdapter(TypeToken.get(elementType));
    ObjectConstructor<T> constructor = constructorConstructor.get(typeToken);
    // create() doesn't define a type parameter
    @SuppressWarnings({ "unchecked", "rawtypes" }) TypeAdapter<T> result = new Adapter(gson, elementType, elementTypeAdapter, constructor);
    return result;
}
Also used : Type(java.lang.reflect.Type) Collection(java.util.Collection) TypeAdapter(com.google.gson.TypeAdapter)

Example 8 with TypeAdapter

use of com.google.gson.TypeAdapter in project maple-ir by LLVM-but-worse.

the class MapTypeAdapterFactory method create.

public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> typeToken) {
    Type type = typeToken.getType();
    Class<? super T> rawType = typeToken.getRawType();
    if (!Map.class.isAssignableFrom(rawType)) {
        return null;
    }
    Class<?> rawTypeOfSrc = $Gson$Types.getRawType(type);
    Type[] keyAndValueTypes = $Gson$Types.getMapKeyAndValueTypes(type, rawTypeOfSrc);
    TypeAdapter<?> keyAdapter = getKeyAdapter(gson, keyAndValueTypes[0]);
    TypeAdapter<?> valueAdapter = gson.getAdapter(TypeToken.get(keyAndValueTypes[1]));
    ObjectConstructor<T> constructor = constructorConstructor.get(typeToken);
    @SuppressWarnings({ "unchecked", "rawtypes" }) TypeAdapter<T> // we don't define a type parameter for the key or value types
    result = new Adapter(gson, keyAndValueTypes[0], keyAdapter, keyAndValueTypes[1], valueAdapter, constructor);
    return result;
}
Also used : Type(java.lang.reflect.Type) TypeAdapter(com.google.gson.TypeAdapter) Map(java.util.Map)

Example 9 with TypeAdapter

use of com.google.gson.TypeAdapter in project maple-ir by LLVM-but-worse.

the class ReflectiveTypeAdapterFactory method createBoundField.

private ReflectiveTypeAdapterFactory.BoundField createBoundField(final Gson context, final Field field, final String name, final TypeToken<?> fieldType, boolean serialize, boolean deserialize) {
    final boolean isPrimitive = Primitives.isPrimitive(fieldType.getRawType());
    // special casing primitives here saves ~5% on Android...
    return new ReflectiveTypeAdapterFactory.BoundField(name, serialize, deserialize) {

        final TypeAdapter<?> typeAdapter = getFieldAdapter(context, field, fieldType);

        // the type adapter and field type always agree
        @SuppressWarnings({ "unchecked", "rawtypes" })
        @Override
        void write(JsonWriter writer, Object value) throws IOException, IllegalAccessException {
            Object fieldValue = field.get(value);
            TypeAdapter t = new TypeAdapterRuntimeTypeWrapper(context, this.typeAdapter, fieldType.getType());
            t.write(writer, fieldValue);
        }

        @Override
        void read(JsonReader reader, Object value) throws IOException, IllegalAccessException {
            Object fieldValue = typeAdapter.read(reader);
            if (fieldValue != null || !isPrimitive) {
                field.set(value, fieldValue);
            }
        }

        public boolean writeField(Object value) throws IOException, IllegalAccessException {
            if (!serialized)
                return false;
            Object fieldValue = field.get(value);
            // avoid recursion for example for Throwable.cause
            return fieldValue != value;
        }
    };
}
Also used : JsonAdapterAnnotationTypeAdapterFactory.getTypeAdapter(com.google.gson.internal.bind.JsonAdapterAnnotationTypeAdapterFactory.getTypeAdapter) TypeAdapter(com.google.gson.TypeAdapter) JsonReader(com.google.gson.stream.JsonReader) JsonWriter(com.google.gson.stream.JsonWriter)

Example 10 with TypeAdapter

use of com.google.gson.TypeAdapter in project maple-ir by LLVM-but-worse.

the class TypeAdapterRuntimeTypeWrapper method write.

@SuppressWarnings({ "rawtypes", "unchecked" })
@Override
public void write(JsonWriter out, T value) throws IOException {
    // Order of preference for choosing type adapters
    // First preference: a type adapter registered for the runtime type
    // Second preference: a type adapter registered for the declared type
    // Third preference: reflective type adapter for the runtime type (if it is a sub class of the declared type)
    // Fourth preference: reflective type adapter for the declared type
    TypeAdapter chosen = delegate;
    Type runtimeType = getRuntimeTypeIfMoreSpecific(type, value);
    if (runtimeType != type) {
        TypeAdapter runtimeTypeAdapter = context.getAdapter(TypeToken.get(runtimeType));
        if (!(runtimeTypeAdapter instanceof ReflectiveTypeAdapterFactory.Adapter)) {
            // The user registered a type adapter for the runtime type, so we will use that
            chosen = runtimeTypeAdapter;
        } else if (!(delegate instanceof ReflectiveTypeAdapterFactory.Adapter)) {
            // The user registered a type adapter for Base class, so we prefer it over the
            // reflective type adapter for the runtime type
            chosen = delegate;
        } else {
            // Use the type adapter for runtime type
            chosen = runtimeTypeAdapter;
        }
    }
    chosen.write(out, value);
}
Also used : Type(java.lang.reflect.Type) TypeAdapter(com.google.gson.TypeAdapter) TypeAdapter(com.google.gson.TypeAdapter)

Aggregations

TypeAdapter (com.google.gson.TypeAdapter)23 JsonReader (com.google.gson.stream.JsonReader)16 JsonWriter (com.google.gson.stream.JsonWriter)16 JsonElement (com.google.gson.JsonElement)12 JsonPrimitive (com.google.gson.JsonPrimitive)10 Map (java.util.Map)10 JsonObject (com.google.gson.JsonObject)9 IOException (java.io.IOException)9 JsonParseException (com.google.gson.JsonParseException)8 Type (java.lang.reflect.Type)7 LinkedHashMap (java.util.LinkedHashMap)7 Gson (com.google.gson.Gson)2 TypeToken (com.google.gson.reflect.TypeToken)2 ArrayList (java.util.ArrayList)2 Nullable (javax.annotation.Nullable)2 Reference (ch.aaap.harvestclient.domain.reference.Reference)1 HarvestRuntimeException (ch.aaap.harvestclient.exception.HarvestRuntimeException)1 ImmutableList (com.google.common.collect.ImmutableList)1 ImmutableMap (com.google.common.collect.ImmutableMap)1 GsonBuilder (com.google.gson.GsonBuilder)1