package retrofit.converter;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import retrofit.mime.TypedByteArray;
import retrofit.mime.TypedInput;
import retrofit.mime.TypedOutput;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.lang.reflect.Type;
/**
* A {@link Converter} which uses Jackson for reading and writing entities.
*
* @author Kai Waldron (kaiwaldron@gmail.com)
*/
public class JacksonConverter implements Converter
{
private static final String MIME_TYPE = "application/json; charset=UTF-8";
private final ObjectMapper objectMapper;
public JacksonConverter(ObjectMapper objectMapper)
{
this.objectMapper = objectMapper;
}
@Override
public Object fromBody(TypedInput body, final Type type) throws ConversionException
{
try
{
final JavaType javaType = objectMapper.getTypeFactory().constructType(type);
return objectMapper.readValue(body.in(), javaType);
}
catch (final JsonParseException e)
{
throw new ConversionException(e);
}
catch (final JsonMappingException e)
{
throw new ConversionException(e);
}
catch (final IOException e)
{
throw new ConversionException(e);
}
}
@Override
public TypedOutput toBody(Object object)
{
try
{
final String json = objectMapper.writeValueAsString(object);
return new TypedByteArray(MIME_TYPE, json.getBytes("UTF-8"));
}
catch (final JsonProcessingException e)
{
throw new AssertionError(e);
}
catch (final UnsupportedEncodingException e)
{
throw new AssertionError(e);
}
}
}