Para configurar Retrofit 2 para utilizar Fastjson como el serializador/deserializador de datos, es necesario implementar clases personalizadas que actúen como Converter para las solicitudes y respuestas HTTP.
Implementación del Conversor para Cuerpos de Solicitud (RequestBody)
Primero, creamos una clase que maneja la conversión de objetos Java a RequestBody en formato JSON utilizando Fastjson.
package com.example.converters;
import com.alibaba.fastjson.JSON;
import java.io.IOException;
import okhttp3.MediaType;
import okhttp3.RequestBody;
import retrofit2.Converter;
public class FastJsonRequestBodyConverter<T> implements Converter<T, RequestBody> {
private static final MediaType MEDIA_TYPE = MediaType.parse("application/json; charset=UTF-8");
@Override
public RequestBody convert(T value) throws IOException {
byte[] postBodyBytes = JSON.toJSONBytes(value);
return RequestBody.create(MEDIA_TYPE, postBodyBytes);
}
}
Implementación del Conversor para Cuerpos de Respuesta (ResponseBody)
A continuación, implementamos la clase para deserializar la respuesta del servidor (en formato JSON) a objetos Java utilizando Fastjson.
package com.example.converters;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import java.io.IOException;
import java.lang.reflect.Type;
import okhttp3.ResponseBody;
import okio.BufferedSource;
import okio.Okio;
import retrofit2.Converter;
public class FastJsonResponseBodyConverter<T> implements Converter<ResponseBody, T> {
private final Type responseType;
public FastJsonResponseBodyConverter(Type type) {
this.responseType = type;
}
@Override
public T convert(ResponseBody value) throws IOException {
BufferedSource source = Okio.buffer(value.source());
String responseBodyString = source.readUtf8();
source.close();
// Utiliza TypeReference para manejar tipos genéricos complejos si es necesario
// Para tipos simples, JSON.parseObject(responseBodyString, responseType) es suficiente.
return JSON.parseObject(responseBodyString, responseType, new com.alibaba.fastjson.parser.Feature[0]);
}
}
Creación del Factory para los Convertidores
Se necesita un Converter.Factory para instruir a Retrofit cómo crear las instancias de los convertidores personalizados.
package com.example.converters;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
import okhttp3.RequestBody;
import okhttp3.ResponseBody;
import retrofit2.Converter;
import retrofit2.Retrofit;
public class FastJsonConverterFactory extends Converter.Factory {
public static FastJsonConverterFactory create() {
return new FastJsonConverterFactory();
}
@Override
public Converter<ResponseBody, ?> responseBodyConverter(Type type, Annotation[] annotations, Retrofit retrofit) {
return new FastJsonResponseBodyConverter<>(type);
}
@Override
public Converter<?, RequestBody> requestBodyConverter(Type type, Annotation[] parameterAnnotations, Annotation[] methodAnnotations, Retrofit retrofit) {
return new FastJsonRequestBodyConverter<>();
}
}
Configuración de Retrofit
Finalmente, al construir la instancia de Retrofit, se añade el FastJsonConverterFactory a la lista de fábricas de convertidores.
// Ejemplo de configuración de Retrofit
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://api.example.com/")
.client(okHttpClientInstance) // Instancia de OkHttpClient configurada previamente
.addConverterFactory(FastJsonConverterFactory.create()) // Añadir el factory de Fastjson
.addCallAdapterFactory(RxJava2CallAdapterFactory.create()) // Si se usa RxJava
.build();
Con esta configuración, Retrofti utilizará Fastjson para serializar los objetos enviados en las solicitudes y deserializar las respuestas recibidas del servidor.