Java tutorial
/** * Copyright (c) 2016 Mattermost, Inc. All Rights Reserved. * See License.txt for license information. */ package com.mattermost.service.jacksonconverter; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.JavaType; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectReader; import com.fasterxml.jackson.databind.ObjectWriter; import com.fasterxml.jackson.databind.PropertyNamingStrategy; import com.squareup.okhttp.MediaType; import com.squareup.okhttp.RequestBody; import com.squareup.okhttp.ResponseBody; import java.io.IOException; import java.io.Reader; import java.lang.annotation.Annotation; import java.lang.reflect.Type; import retrofit.Converter; import retrofit.Retrofit; public final class JacksonConverterFactory extends Converter.Factory { private final ObjectMapper mapper; public static JacksonConverterFactory create() { return create(new ObjectMapper()); } public static JacksonConverterFactory create(ObjectMapper mapper) { return new JacksonConverterFactory(mapper); } private JacksonConverterFactory(ObjectMapper mapper) { if (mapper == null) throw new NullPointerException("mapper == null"); this.mapper = mapper; this.mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); this.mapper.setPropertyNamingStrategy(PropertyNamingStrategy.CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES); } @Override public Converter<ResponseBody, ?> fromResponseBody(Type type, Annotation[] annotations) { JavaType javaType = mapper.getTypeFactory().constructType(type); ObjectReader reader = mapper.reader(javaType); return new JacksonResponseBodyConverter<>(reader); } @Override public Converter<?, RequestBody> toRequestBody(Type type, Annotation[] annotations) { JavaType javaType = mapper.getTypeFactory().constructType(type); ObjectWriter writer = mapper.writerWithType(javaType); return new JacksonRequestBodyConverter<>(writer); } static class JacksonRequestBodyConverter<T> implements Converter<T, RequestBody> { private static final MediaType MEDIA_TYPE = MediaType.parse("application/json; charset=UTF-8"); private final ObjectWriter adapter; JacksonRequestBodyConverter(ObjectWriter adapter) { this.adapter = adapter; } @Override public RequestBody convert(T value) throws IOException { byte[] bytes = adapter.writeValueAsBytes(value); return RequestBody.create(MEDIA_TYPE, bytes); } } static class JacksonResponseBodyConverter<T> implements Converter<ResponseBody, T> { private final ObjectReader adapter; JacksonResponseBodyConverter(ObjectReader adapter) { this.adapter = adapter; } @Override public T convert(ResponseBody value) throws IOException { Reader reader = value.charStream(); try { return adapter.readValue(reader); } finally { if (reader != null) { try { reader.close(); } catch (IOException ignored) { } } } } } }