package com.mcxtzhang.rxjava2demo.retrofit.base.gson; import com.google.gson.Gson; import com.google.gson.TypeAdapter; import com.google.gson.reflect.TypeToken; import java.lang.annotation.Annotation; import java.lang.reflect.Type; import okhttp3.RequestBody; import okhttp3.ResponseBody; import retrofit2.Converter; import retrofit2.Retrofit; /** * A {@linkplain Converter.Factory converter} which uses Gson for JSON. * <p> * Because Gson is so flexible in the types it supports, this converter assumes that it can handle * all types. If you are mixing JSON serialization with something else (such as protocol buffers), * you must {@linkplain Retrofit.Builder#addConverterFactory(Converter.Factory) add this instance} * last to allow the other converters a chance to see their types. */ public final class AlyGsonConverterFactory extends Converter.Factory { /** * Create an instance using a default {@link Gson} instance for conversion. Encoding to JSON and * decoding from JSON (when no charset is specified by a header) will use UTF-8. */ public static AlyGsonConverterFactory create() { return create(new Gson()); } /** * Create an instance using {@code gson} for conversion. Encoding to JSON and * decoding from JSON (when no charset is specified by a header) will use UTF-8. */ public static AlyGsonConverterFactory create(Gson gson) { return new AlyGsonConverterFactory(gson); } private final Gson gson; private AlyGsonConverterFactory(Gson gson) { if (gson == null) throw new NullPointerException("gson == null"); this.gson = gson; } @Override public Converter<ResponseBody, ?> responseBodyConverter(Type type, Annotation[] annotations, Retrofit retrofit) { //我们只关实现从ResponseBody 到 String 的转换,所以其它方法可不覆盖 //若其它类型我们不处理,返回null就行 /*TypeAdapter<?> adapter = gson.getAdapter(TypeToken.get(type)); return new GsonEntityResponseBodyConverter<>(gson, adapter);*/ //方法 1 自动剥离 //return new GsonEntityResponseBodyConverter<>(gson, type); //方法 2 不自动剥离 但是通过map一个函数去完成 return new GsonAllResponseBodyConverter<>(gson, type); } @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); } }