/** A {@linkplain Converter.Factory converter} which uses Jackson. */
public final class JacksonConverterFactory implements Converter.Factory {
/** Create an instance using a default {@link ObjectMapper} instance for conversion. */
public static JacksonConverterFactory create() {
return create(new ObjectMapper());
}
/** Create an instance using {@code mapper} for conversion. */
public static JacksonConverterFactory create(ObjectMapper mapper) {
return new JacksonConverterFactory(mapper);
}
private final ObjectMapper mapper;
private JacksonConverterFactory(ObjectMapper mapper) {
if (mapper == null) throw new NullPointerException("mapper == null");
this.mapper = mapper;
}
/** Create a converter for {@code type}. */
@Override public Converter<?> get(Type type) {
JavaType javaType = mapper.getTypeFactory().constructType(type);
ObjectWriter writer = mapper.writerWithType(javaType);
ObjectReader reader = mapper.reader(javaType);
return new JacksonConverter<>(writer, reader);
}
}
<pre name="code" class="java">class JacksonConverter<T> implements Converter<T> {
private static final MediaType MEDIA_TYPE = MediaType.parse("application/json; charset=utf-8");
private final ObjectWriter writer;
private final ObjectReader reader;
JacksonConverter(ObjectWriter writer, ObjectReader reader) {
this.writer = writer;
this.reader = reader;
}
@Override
public T fromBody(ResponseBody body) throws IOException {
String jsonString = new String(body.string());
while (jsonString != null && jsonString.startsWith("\ufeff")) {
jsonString =
jsonString.substring(1);
}
if(Constants.DEBUG)
Log.d("********",jsonString);
return reader.readValue(jsonString);
}
@Override
public RequestBody toBody(T value) {
try {
if (value instanceof RequestBody) {
return (RequestBody) value;
}
byte[] bytes = writer.writeValueAsBytes(value);
return RequestBody.create(MEDIA_TYPE, bytes);
} catch (JsonProcessingException e) {
throw new RuntimeException(e);
}
}
}
<pre name="code" class="java"> @Provides
@Singleton
Retrofit provideRetrofit() {
File cacheDir = new File(String.valueOf(application.getCacheDir()), "HttpResponseCache");
OkHttpClient okHttpClient = new OkHttpClient();
okHttpClient.setCache(new Cache(cacheDir, 10 * 1024 * 1024));
okHttpClient.setConnectTimeout(2 * 1000, TimeUnit.MILLISECONDS);
okHttpClient.setReadTimeout(60 * 1000, TimeUnit.MILLISECONDS);
okHttpClient.interceptors().add(new LoggingInterceptor());
Retrofit retrofit = new Retrofit.Builder()
.client(okHttpClient)
.baseUrl(HTTP_URL)
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.addConverterFactory(JacksonConverterFactory.create())
.build();
return retrofit;
}