List of usage examples for com.google.gson.reflect TypeToken get
public static <T> TypeToken<T> get(Class<T> type)
From source file:com.flipkart.batching.gson.RuntimeTypeAdapterFactory.java
License:Open Source License
public <R> TypeAdapter<R> create(Gson gson, TypeToken<R> type) { if (type.getRawType() != baseType) { return null; }/*from w w w . j a va 2s . c om*/ final Map<String, TypeAdapter<?>> labelToDelegate = new LinkedHashMap<>(); final Map<Class<?>, TypeAdapter<?>> subtypeToDelegate = new LinkedHashMap<>(); for (Map.Entry<String, Class<?>> entry : labelToSubtype.entrySet()) { TypeAdapter<?> delegate = labelToTypeAdapter.get(entry.getKey()); if (delegate == null) { delegate = gson.getDelegateAdapter(this, TypeToken.get(entry.getValue())); } labelToDelegate.put(entry.getKey(), delegate); subtypeToDelegate.put(entry.getValue(), delegate); } return new TypeAdapter<R>() { @Override public R read(JsonReader reader) throws IOException { if (reader.peek() == com.google.gson.stream.JsonToken.NULL) { reader.nextNull(); return null; } if (reader.peek() != com.google.gson.stream.JsonToken.BEGIN_OBJECT) { reader.skipValue(); return null; } reader.beginObject(); String label = null; R result = null; while (reader.hasNext()) { String name = reader.nextName(); com.google.gson.stream.JsonToken jsonToken = reader.peek(); if (jsonToken == com.google.gson.stream.JsonToken.NULL) { reader.skipValue(); continue; } switch (name) { case "type": label = TypeAdapters.STRING.read(reader); break; case "value": @SuppressWarnings("unchecked") // registration requires that subtype extends T TypeAdapter<R> delegate = label == null ? null : (TypeAdapter<R>) labelToDelegate.get(label); if (delegate == null) { throw new JsonParseException("cannot deserialize " + baseType + " subtype named " + label + "; did you forget to register a subtype?"); } result = delegate.read(reader); break; default: reader.skipValue(); break; } } reader.endObject(); return result; } @Override public void write(JsonWriter out, R value) throws IOException { Class<?> srcType = value.getClass(); @SuppressWarnings("unchecked") // registration requires that subtype extends T TypeAdapter<R> delegate = (TypeAdapter<R>) subtypeToDelegate.get(srcType); if (delegate == null) { throw new JsonParseException( "cannot serialize " + srcType.getName() + "; did you forget to register a subtype?"); } String label = subtypeToLabel.get(srcType); out.beginObject(); out.name("type"); out.value(label); out.name("value"); delegate.write(out, value); out.endObject(); } }.nullSafe(); }
From source file:com.gilecode.yagson.adapters.AdapterUtils.java
License:Apache License
@SuppressWarnings("unchecked") public static <T> void writeByReflectiveAdapter(JsonWriter out, T obj, WriteContext ctx, Gson gson, Type formalType) throws IOException { TypeToken<T> typeToken = (TypeToken<T>) TypeToken.get(TypeUtils.mergeTypes(obj.getClass(), formalType)); TypeAdapter<T> adapter = gson.getAdapter(typeToken); if (!(adapter instanceof ReflectiveTypeAdapterFactory.Adapter)) { adapter = gson.getReflectiveTypeAdapterFactory().create(gson, typeToken); }//w ww . ja v a2 s . c o m adapter.write(out, obj, ctx); }
From source file:com.gilecode.yagson.adapters.DefaultTypeAdapterRuntimeWrapper.java
License:Apache License
private TypeAdapter<T> getTypeAdapterFor(Class<? extends T> rawType) { Type type = TypeUtils.mergeTypes(rawType, formalType); return (TypeAdapter<T>) gson.getAdapter(TypeToken.get(type)); }
From source file:com.gilecode.yagson.adapters.ThreadTypesAdapterFactory.java
License:Apache License
@Override public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> typeToken) { Class<? super T> rawType = typeToken.getRawType(); if (ThreadGroup.class.isAssignableFrom(rawType)) { @SuppressWarnings({ "unchecked", "rawtypes" }) TypeAdapter<T> result = (TypeAdapter) new ThreadGroupAdapter(); return result; } else if (Thread.class.isAssignableFrom(rawType)) { @SuppressWarnings({ "unchecked", "rawtypes" }) TypeAdapter<T> result = (TypeAdapter) new ThreadAdapter(); return result; } else if (ThreadLocal.class.isAssignableFrom(rawType)) { TypeToken<?> fieldType = TypeToken.get($Gson$Types.getSingleParameterType(typeToken.getType(), typeToken.getRawType(), ThreadLocal.class)); ReflectiveTypeAdapterFactory.BoundField valueField = new ReflectiveTypeAdapterFactory.DefaultBoundField( "@.value", null, true, true, gson, fieldType) { @Override//from ww w . j a v a2s . c o m protected boolean writeField(Object value, WriteContext ctx) throws IOException, IllegalAccessException { if (value == null) { return false; } Object threadLocalMap = getCurrentThreadMap(value); return threadLocalMap != null && getThreadLocalEntry(threadLocalMap, value) != null; } @Override @SuppressWarnings("unchecked") protected void applyReadFieldValue(Object value, Object fieldValue) throws IllegalAccessException { if (fieldValue != null) { ((ThreadLocal) value).set(fieldValue); } } @Override protected Object getFieldValue(Object value) throws IllegalAccessException { Object threadLocalMap = getCurrentThreadMap(value); if (threadLocalMap != null) { Object threadLocalEntry = getThreadLocalEntry(threadLocalMap, value); if (threadLocalEntry != null) { return threadLocalEntryValueField.get(threadLocalEntry); } } return null; } @SuppressWarnings("unchecked") protected void applyReadPlaceholder(final Object value, Map<Field, ReferencePlaceholder> fieldPlaceholders, ReferencePlaceholder fieldValuePlaceholder) { // the thread local's "value" is not a real field, so do not add it to 'fieldPlaceholders' map fieldValuePlaceholder.registerUse(new PlaceholderUse() { @Override public void applyActualObject(Object actualObject) throws IOException { try { applyReadFieldValue(value, actualObject); } catch (IllegalAccessException e) { throw new IOException(e); } } }); } }; return gson.getReflectiveTypeAdapterFactory().createSpecial(gson, typeToken, Collections.singletonList(valueField), null); } return null; }
From source file:com.gilecode.yagson.types.ConstructingObjectProvider.java
License:Apache License
@SuppressWarnings("unchecked") public static <E> ObjectProvider<E> defaultOf(E instance, ConstructorConstructor cc) { TypeToken<E> typeToken = (TypeToken<E>) TypeToken.get(instance.getClass()); return new ConstructingObjectProvider<E>(cc.get(typeToken)); }
From source file:com.gilecode.yagson.types.TypeUtils.java
License:Apache License
private static <T> T readTypeAdvisedValueAfterType(Gson gson, JsonReader in, ReadContext ctx, Type valueType) throws IOException { T result = null;//from w w w.j av a 2 s .co m if (consumeValueField(in)) { // use actual type adapter instead of delegate TypeAdapter<?> typeAdapter = gson.getAdapter(TypeToken.get(valueType)); result = (T) typeAdapter.read(in, ctx); } in.endObject(); return result; }
From source file:com.gilecode.yagson.types.TypeUtils.java
License:Apache License
public static void writeTypeWrapperAndValue(JsonWriter out, Object value, TypeAdapter adapter, WriteContext ctx) throws IOException { Class<?> actualClass = value.getClass(); String parameterTypes = ""; if (EnumSet.class.isAssignableFrom(actualClass)) { Class<? extends Enum> enumClass = getField(enumSetElementTypeField, value); // change the written class to EnumSet (from RegularEnumSet/JumboEnumSet) actualClass = EnumSet.class; // write parameter for EnumSet type parameterTypes = "<" + enumClass.getName() + ">"; // replace the used adapter for the one with known element type Type enumSetType = $Gson$Types.newParameterizedTypeWithOwner(null, actualClass, enumClass); adapter = ctx.getGson().getAdapter(TypeToken.get(enumSetType)); } else if (EnumMap.class.isAssignableFrom(actualClass)) { Class<? extends Enum> enumClass = getField(enumMapKeyTypeField, value); int mapKeyTypeVarIdx; TypeVariable[] actualClassTypeVariables = actualClass.getTypeParameters(); if (EnumMap.class.equals(actualClass)) { mapKeyTypeVarIdx = 0;/*from w ww. j a v a 2 s .c o m*/ parameterTypes = "<" + enumClass.getName() + ",?>"; } else { // the parameters may be overridden in subclasses // print the parameters, only if the enum (key) type is still present in the parameters lists of the actuall class TypeVariable mapKeyTypeVar = EnumMap.class.getTypeParameters()[0]; mapKeyTypeVarIdx = indexOfInheritedTypeVariable(mapKeyTypeVar, EnumMap.class, actualClass); if (mapKeyTypeVarIdx >= 0) { StringBuilder sb = new StringBuilder(); sb.append("<"); for (int i = 0; i < actualClassTypeVariables.length; i++) { if (i == mapKeyTypeVarIdx) { sb.append(enumClass.getName()); } else { sb.append('?'); } sb.append(','); } sb.setCharAt(sb.length() - 1, '>'); // delete last ',' and add '>' parameterTypes = sb.toString(); } } if (mapKeyTypeVarIdx >= 0) { TypeAdapter resolvedAdapter = AdapterUtils.resolve(adapter, value); if (resolvedAdapter instanceof MapTypeAdapterFactory.Adapter) { Type formalMapType = ((MapTypeAdapterFactory.Adapter) resolvedAdapter).getFormalMapType(); Type[] typeArgsWithExactKeyType = new Type[actualClassTypeVariables.length]; Arrays.fill(typeArgsWithExactKeyType, unknownType); typeArgsWithExactKeyType[mapKeyTypeVarIdx] = enumClass; Type mergedMapType = mergeTypes($Gson$Types.newParameterizedTypeWithOwner( actualClass.getEnclosingClass(), actualClass, typeArgsWithExactKeyType), formalMapType); adapter = ctx.getGson().getAdapter(TypeToken.get(mergedMapType)); } } // else key type is already fixed in subtypes, so do not print params and do not update adapter } // do not print type wrapper if the value is known to be skipped boolean isValueSkipped = AdapterUtils.isSkipSerializeTypeAdapter(adapter); if (!isValueSkipped) { out.beginObject(); out.name("@type"); out.value(actualClass.getName() + parameterTypes); out.name("@val"); } adapter.write(out, value, ctx); if (!isValueSkipped) { out.endObject(); } }
From source file:com.github.easyjsonapi.adapters.EasyJsonApiMachine.java
License:Apache License
/** * Set classes need to use when create the json api structure * /*from w w w.j a va2 s. c o m*/ * @param clazz * the class or classes need to use */ public final void setClassesUsed(Class<?>... clazz) { this.tokenTypesToUse.clear(); if (this.classesUsedInJson.isEmpty()) { this.classesUsedInJson.addAll(Arrays.asList(clazz)); } else { if (this.classesUsedInJson.isEmpty()) { this.classesUsedInJson.addAll(Arrays.asList(clazz)); } else { this.classesUsedInJson.addAll(Arrays.asList(clazz)); this.classesUsedInJson.retainAll(Arrays.asList(clazz)); } } if (this.config.getClassesParsed().isEmpty()) { // Use Map structure to support the default configuration Type mapType = TypeToken.get(Map.class).getType(); this.tokenTypesToUse.put(EasyJsonApiTypeToken.TOKEN_DEFAULT, mapType); } else { for (Map.Entry<EasyJsonApiTypeToken, List<Class<?>>> clazzMapping : this.config.getClassesParsed() .entrySet()) { List<Class<?>> classes = clazzMapping.getValue(); for (Class<?> cla : classes) { if (this.classesUsedInJson.contains(cla)) { Type classType = TypeToken.get(cla).getType(); this.tokenTypesToUse.put(clazzMapping.getKey(), classType); } } } } }
From source file:com.github.kyriosdata.regras.infraestrutura.CustomRegraTypeAdapterFactory.java
License:Creative Commons License
@Override public <T> TypeAdapter<T> create(final Gson gson, final TypeToken<T> type) { if (type.getRawType() != Regra.class) return null; final TypeAdapter<T> delegate = gson.getDelegateAdapter(this, type); return new TypeAdapter<T>() { @Override//from w w w. j a v a 2s. c o m public void write(final JsonWriter jsonWriter, final T t) throws IOException { jsonWriter.beginObject(); jsonWriter.name("tipo"); jsonWriter.value(getTipo(t.getClass().getName())); jsonWriter.name("obj"); delegate.write(jsonWriter, t); jsonWriter.endObject(); } @Override public T read(final JsonReader jsonReader) throws IOException, JsonParseException { JsonElement tree = Streams.parse(jsonReader); JsonObject object = tree.getAsJsonObject(); String clazz = object.get("tipo").getAsString(); JsonElement obj = object.get("obj").getAsJsonObject(); if ("expressao".equals(clazz)) { return (T) gson.getDelegateAdapter(CustomRegraTypeAdapterFactory.this, TypeToken.get(RegraExpressao.class)).fromJsonTree(obj); } if ("pontosPorRelato".equals(clazz)) { return (T) gson.getDelegateAdapter(CustomRegraTypeAdapterFactory.this, TypeToken.get(RegraPontosPorRelato.class)).fromJsonTree(obj); } throw new JsonParseException("Erro ao desserializar " + type + ". No uma regra?"); } }; }
From source file:com.github.ljtfreitas.restify.http.client.message.converter.json.GsonMessageConverter.java
License:Open Source License
@Override public T read(HttpResponseMessage httpResponseMessage, Type expectedType) throws RestifyHttpMessageReadException { try {/*ww w . j a va 2s . c o m*/ TypeToken<?> token = TypeToken.get(expectedType); Reader json = new InputStreamReader(httpResponseMessage.body()); return this.gson.fromJson(json, token.getType()); } catch (JsonIOException | JsonSyntaxException e) { throw new RestifyHttpMessageReadException(e); } }