@Override public Converter<?, RequestBody> requestBodyConverter(Type type, Annotation[] parameterAnnotations, Annotation[] methodAnnotations, Retrofit retrofit) { TypeAdapter<?> adapter = gson.getAdapter(TypeToken.get(type)); return new GsonRequestBodyConverter<>(gson, adapter); } }
@Override public Converter<ResponseBody, ?> responseBodyConverter(Type type, Annotation[] annotations, Retrofit retrofit) { TypeAdapter<?> adapter = gson.getAdapter(TypeToken.get(type)); return new GsonResponseBodyConverter<>(gson, adapter); }
@SafeVarargs public static <T> ExpectedSubtypesAdapter<T> create( Gson gson, Class<T> type, TypeToken<? extends T>... subtypes) { return create(gson, TypeToken.get(type), subtypes); }
private <S> void writeObject(S value, JsonWriter out) throws IOException { if (value != null) { JsonObject jsonObject = new JsonObject(); jsonObject.add(OBJECT_TYPE, new JsonPrimitive(value.getClass().getName())); TypeAdapter<S> delegate = (TypeAdapter<S>) this.gson.getDelegateAdapter(this.factory, TypeToken.get(value.getClass())); jsonObject.add(OBJECT_DATA, delegate.toJsonTree(value)); Streams.write(jsonObject, out); } else { out.nullValue(); } }
@Override public Parser<ResponseBody, ?> responseBodyParser(Type type) { TypeAdapter<?> adapter = gson.getAdapter(TypeToken.get(type)); return new GsonResponseBodyParser<>(gson, adapter); }
@Override public Parser<?, RequestBody> requestBodyParser(Type type) { TypeAdapter<?> adapter = gson.getAdapter(TypeToken.get(type)); return new GsonRequestBodyParser<>(gson, adapter); }
@SuppressWarnings("unchecked") @Override public Object read(Gson gson, Type type, InputStream stream) throws IOException { @Nullable JsonReader reader = null; try { reader = createJsonReader(new BufferedReader(new InputStreamReader(stream, CHARSET_NAME))); options.setReaderOptions(reader); return gson.getAdapter((TypeToken<Object>) TypeToken.get(type)).read(reader); } catch (IOException ex) { throw ex; } catch (Exception ex) { throw new IOException(ex); } }
@SuppressWarnings("unchecked") @Override public void write(JsonWriter out, R value) throws IOException { Class<?> valueClass = value.getClass(); String valueTypeName = valueClass.getName(); TypeToken<?> valueType = TypeToken.get(valueClass); TypeAdapter<R> delegate = (TypeAdapter<R>) gson.getDelegateAdapter(PolymorphicTypeAdapterFactory.this, valueType); if (delegate == null) { throw new JsonParseException("Could not serialize " + valueClass.getName()); } JsonElement jsonElement = delegate.toJsonTree(value); if (valueClass != baseClass) { JsonObject jsonObject = jsonElement.getAsJsonObject(); JsonObject clone = new JsonObject(); clone.add(TYPE_FIELD_NAME, new JsonPrimitive(valueTypeName)); for (Map.Entry<String, JsonElement> e : jsonObject.entrySet()) { clone.add(e.getKey(), e.getValue()); } Streams.write(clone, out); } else { Streams.write(jsonElement, out); } }
@Override public Converter<?, RequestBody> requestBodyConverter(Type type, Annotation[] parameterAnnotations, Annotation[] methodAnnotations, Retrofit retrofit) { TypeAdapter<?> adapter = gson.getAdapter(TypeToken.get(type)); return new GsonRequestBodyConverter<>(gson, adapter); } }
@Override public Converter<ResponseBody, ?> responseBodyConverter(Type type, Annotation[] annotations, Retrofit retrofit) { TypeAdapter<?> adapter = gson.getAdapter(TypeToken.get(type)); return new GsonResponseBodyConverter<>(gson, adapter); }
private <S> S readValue(JsonObject jsonObject, TypeToken<S> defaultTypeToken) throws IOException { try { TypeToken<S> actualTypeToken; if (jsonObject.isJsonNull()) { return null; } else if (jsonObject.has(OBJECT_TYPE)) { String className = jsonObject.get(OBJECT_TYPE).getAsString(); Class<S> klazz = (Class<S>) Class.forName(className); actualTypeToken = TypeToken.get(klazz); } else if (defaultTypeToken != null) { actualTypeToken = defaultTypeToken; } else { throw new IOException("Could not determine TypeToken."); } TypeAdapter<S> delegate = this.gson.getDelegateAdapter(this.factory, actualTypeToken); S value = delegate.fromJsonTree(jsonObject.get(OBJECT_DATA)); return value; } catch (ClassNotFoundException cnfe) { throw new IOException(cnfe); } }
TypeToken<?> valueType = TypeToken.get(valueClass); TypeAdapter<R> delegate = (TypeAdapter<R>) gson.getDelegateAdapter(PolymorphicTypeAdapterFactory.this, valueType);
@Override public <T> T map(Object source, TypeRef<T> targetType, Configuration configuration) { if(source == null){ return null; } try { return (T) factory.call().getAdapter(TypeToken.get(targetType.getType())).fromJsonTree((JsonElement) source); } catch (Exception e){ throw new MappingException(e); } } }
@SuppressWarnings("unchecked") @Override public void write(Gson gson, Type type, Object object, OutputStream stream) throws IOException { @Nullable JsonWriter writer = null; boolean wasOriginalException = false; try { writer = new JsonWriter(new BufferedWriter(new OutputStreamWriter(stream, CHARSET_NAME))); options.setWriterOptions(writer); gson.getAdapter((TypeToken<Object>) TypeToken.get(type)).write(writer, object); } catch (IOException ex) { wasOriginalException = true; throw ex; } catch (Exception ex) { wasOriginalException = true; throw new IOException(ex); } finally { if (writer != null) { try { // underlying stream should not be closed, just flushing writer.flush(); } catch (IOException ex) { if (!wasOriginalException) { throw ex; } } } } }
@SuppressWarnings("unchecked") @Override public Object read(Gson gson, Type type, InputStream stream) throws IOException { @Nullable JsonReader reader = null; try { reader = new JsonParserReader(JSON_FACTORY.createParser(stream)); options.setReaderOptions(reader); return gson.getAdapter((TypeToken<Object>) TypeToken.get(type)).read(reader); } catch (IOException ex) { throw ex; } catch (Exception ex) { throw new IOException(ex); } finally { if (reader != null) { try { // note that stream is not closed here as per JSON_FACTORY configuration reader.close(); } catch (IOException ex) { // ignore io exception of reader close as not important } } } } }
@SuppressWarnings({"resource", "unchecked"}) public static <T> T fromJson(String string, Class<T> type) { TypeAdapter<Object> adapter = GSON.getAdapter((TypeToken<Object>) TypeToken.get(type)); try { if (adapter instanceof com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.Adapter) { throw new IllegalStateException("Immutable adapters not registered"); } JsonParserReader reader = new JsonParserReader(JSON_FACTORY.createParser(string)); return GSON.fromJson(reader, type); } catch (IOException ex) { throw Throwables.propagate(ex); } } }
@Override public Converter<ResponseBody, ?> responseBodyConverter( Type type, Annotation[] annotations, Retrofit retrofit) { // This converter requires an annotation providing the name of the payload in the envelope; // if one is not supplied then return null to continue down the converter chain. final String payloadName = getPayloadName(annotations); if (payloadName == null) return null; final TypeAdapter<?> adapter = gson.getAdapter(TypeToken.get(type)); return (Converter<ResponseBody, Object>) body -> { try (JsonReader jsonReader = gson.newJsonReader(body.charStream())) { jsonReader.beginObject(); while (jsonReader.hasNext()) { if (payloadName.equals(jsonReader.nextName())) { return adapter.read(jsonReader); } else { jsonReader.skipValue(); } } return null; } finally { body.close(); } }; }
@SuppressWarnings({"resource", "unchecked"}) public static String toJson(Object object) { TypeAdapter<Object> adapter = GSON.getAdapter((TypeToken<Object>) TypeToken.get(object.getClass())); try { StringWriter stringWriter = new StringWriter(); JsonGeneratorWriter writer = new JsonGeneratorWriter(JSON_FACTORY.createGenerator(stringWriter)); if (adapter instanceof com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.Adapter) { throw new IllegalStateException("Immutable adapters not registered"); } GSON.toJson(object, object.getClass(), writer); writer.close(); return stringWriter.toString(); } catch (IOException ex) { throw Throwables.propagate(ex); } }
options.setWriterOptions(writer); gson.getAdapter((TypeToken<Object>) TypeToken.get(type)).write(writer, object); } catch (IOException ex) { wasOriginalException = true;
@Test public void adaptersProvided() { check(adapterFactory.create(gson, TypeToken.get(A.class))).notNull(); check(adapterFactory.create(gson, TypeToken.get(B.class))).notNull(); check(adapterFactory.create(gson, TypeToken.get(B.C.class))).notNull(); check(adapterFactory.create(gson, TypeToken.get(D.E.class))).notNull(); check(adapterFactory.create(gson, TypeToken.get(D.F.class))).notNull(); check(adapterFactory.create(gson, TypeToken.get(G.H.class))).notNull(); } }