Integrar Fastjson con Retrofit 2 para Serialización de Datos

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.

Etiquetas: Retrofit fastjson converter serialization Deserialization

Publicado el 8-1 04:54