Custom converter for Retrofit 2 Custom converter for Retrofit 2 json json

Custom converter for Retrofit 2


I was looking for a simple example about how to implement a custom converter for Retrofit 2. Unfortunately found none.

I found this example but, at least for me, it's too complicated for my purpose.

Happilly, I found a solution.

This solution is to use GSON deserializers.

We don't need to create a custom converter, we just have to customize the GSON converter.

Here is a great tutorial. And here is the code I used to parse the JSON described in my question:

  • Login Deserializer: Defines how to parse the JSON as an object of our target class (using conditionals and whatever we need).

  • Custom GSON converter: Builds a GSON converter that uses our custom deserializer.


I found @JCarlos solution to be precise, quick and correct. I needed to implement custom Date converter for Retrofit 2 on Android. It seems that you need to register a new type serializer in GSonConverterFactory. Implementation is done in Kotlin lang.

class RetrofitDateSerializer : JsonSerializer<Date> {    override fun serialize(srcDate: Date?, typeOfSrc: Type?, context: JsonSerializationContext?): JsonElement? {        if (srcDate == null)            return null        val dateFormat = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss")        val formatted = dateFormat.format(srcDate)        return JsonPrimitive(formatted)    }}

and the registration:

private fun buildGsonConverterFactory(): GsonConverterFactory {    val gsonBuilder = GsonBuilder()    // Custom DATE Converter for Retrofit    gsonBuilder.registerTypeAdapter(Date::class.java, RetrofitDateSerializer())    return GsonConverterFactory.create(gsonBuilder.create())}@Provides @Singletoninternal fun providesRetrofit(applicationContext: Context): Retrofit {    return Retrofit.Builder()            .baseUrl(GluApp.Static.BASE_REST_URL_ADDR)            .addConverterFactory(                    buildGsonConverterFactory())            .build()}


compile these two library for retrofit2

compile 'com.squareup.retrofit2:retrofit:2.1.0'compile 'com.squareup.retrofit2:converter-gson:2.0.2'import com.lendingkart.prakhar.lendingkartdemo.retrofitPOJOResponse.DocsNameResponse;import com.lendingkart.prakhar.lendingkartdemo.retrofitrequests.DocName;import retrofit2.Call;import retrofit2.Retrofit;import retrofit2.converter.gson.GsonConverterFactory;import retrofit2.http.Body;import retrofit2.http.Multipart;import retrofit2.http.POST;import retrofit2.http.Part;import retrofit2.http.PartMap;    public interface APIInterface {        String ENDPOINT = "https://app.xxxxxxxxx.com/";        @POST("lkart/api/docs")        Call<DocsNameResponse> DOCS_NAME_RESPONSE_CALL(@Body DocName docName);        public static final Retrofit retrofit = new Retrofit.Builder()                .baseUrl(APIInterface.ENDPOINT)                .addConverterFactory(GsonConverterFactory.create())                .build();    }

call like these where you want to

        String doc_name = "Loans/jdfjdanklnadkm;cnak_";        APIInterface apiInterface = APIInterface.retrofit.create(APIInterface.class);   Call<DocsNameResponse> DocsCall = apiInterface.DOCS_NAME_RESPONSE_CALL(new DocName(doc_name));        DocsCall.enqueue(new Callback<DocsNameResponse>() {            @Override            public void onResponse(Call<DocsNameResponse> call, Response<DocsNameResponse> response) {                Log.d("APIResult", String.valueOf(response.body().getData().get(3).getName()));            }            @Override            public void onFailure(Call<DocsNameResponse> call, Throwable t) {                Log.d("APIError", t.getMessage());            }        });

and two files for the request and response are

DocName

public class DocName {    private String name;    public DocName(String name) {        this.name = name;    }    /**     * @return The name     */    public String getName() {        return name;    }    /**     * @param name The name     */    public void setName(String name) {        this.name = name;    }}

DocNameResponseYou can use http://www.jsonschema2pojo.org/ to convert your JSON to below written format by choosing SourceType : JSON and Annotation Style : GSON

import com.google.gson.annotations.Expose;import com.google.gson.annotations.SerializedName;import java.util.List;public class DocsNameResponse {    @SerializedName("message")    @Expose    private String message;    @SerializedName("statusCode")    @Expose    private Integer statusCode;    @SerializedName("data")    @Expose    private List<Datum> data = null;    @SerializedName("list")    @Expose    private Object list;    @SerializedName("cscStatus")    @Expose    private Boolean cscStatus;    @SerializedName("status")    @Expose    private Object status;    @SerializedName("eligibleStatus")    @Expose    private Boolean eligibleStatus;    @SerializedName("pwd")    @Expose    private Object pwd;    @SerializedName("uname")    @Expose    private Object uname;    @SerializedName("assignedToList")    @Expose    private Object assignedToList;    /**     * @return The message     */    public String getMessage() {        return message;    }    /**     * @param message The message     */    public void setMessage(String message) {        this.message = message;    }    /**     * @return The statusCode     */    public Integer getStatusCode() {        return statusCode;    }    /**     * @param statusCode The statusCode     */    public void setStatusCode(Integer statusCode) {        this.statusCode = statusCode;    }    /**     * @return The data     */    public List<Datum> getData() {        return data;    }    /**     * @param data The data     */    public void setData(List<Datum> data) {        this.data = data;    }    /**     * @return The list     */    public Object getList() {        return list;    }    /**     * @param list The list     */    public void setList(Object list) {        this.list = list;    }    /**     * @return The cscStatus     */    public Boolean getCscStatus() {        return cscStatus;    }    /**     * @param cscStatus The cscStatus     */    public void setCscStatus(Boolean cscStatus) {        this.cscStatus = cscStatus;    }    /**     * @return The status     */    public Object getStatus() {        return status;    }    /**     * @param status The status     */    public void setStatus(Object status) {        this.status = status;    }    /**     * @return The eligibleStatus     */    public Boolean getEligibleStatus() {        return eligibleStatus;    }    /**     * @param eligibleStatus The eligibleStatus     */    public void setEligibleStatus(Boolean eligibleStatus) {        this.eligibleStatus = eligibleStatus;    }    /**     * @return The pwd     */    public Object getPwd() {        return pwd;    }    /**     * @param pwd The pwd     */    public void setPwd(Object pwd) {        this.pwd = pwd;    }    /**     * @return The uname     */    public Object getUname() {        return uname;    }    /**     * @param uname The uname     */    public void setUname(Object uname) {        this.uname = uname;    }    /**     * @return The assignedToList     */    public Object getAssignedToList() {        return assignedToList;    }    /**     * @param assignedToList The assignedToList     */    public void setAssignedToList(Object assignedToList) {        this.assignedToList = assignedToList;    }    public class Datum {        @SerializedName("id")        @Expose        private Object id;        @SerializedName("name")        @Expose        private String name;        @SerializedName("applicationId")        @Expose        private Object applicationId;        @SerializedName("userId")        @Expose        private Object userId;        @SerializedName("documentName")        @Expose        private String documentName;        @SerializedName("documentType")        @Expose        private Object documentType;        @SerializedName("freshloan")        @Expose        private Object freshloan;        /**         * @return The id         */        public Object getId() {            return id;        }        /**         * @param id The id         */        public void setId(Object id) {            this.id = id;        }        /**         * @return The name         */        public String getName() {            return name;        }        /**         * @param name The name         */        public void setName(String name) {            this.name = name;        }        /**         * @return The applicationId         */        public Object getApplicationId() {            return applicationId;        }        /**         * @param applicationId The applicationId         */        public void setApplicationId(Object applicationId) {            this.applicationId = applicationId;        }        /**         * @return The userId         */        public Object getUserId() {            return userId;        }        /**         * @param userId The userId         */        public void setUserId(Object userId) {            this.userId = userId;        }        /**         * @return The documentName         */        public String getDocumentName() {            return documentName;        }        /**         * @param documentName The documentName         */        public void setDocumentName(String documentName) {            this.documentName = documentName;        }        /**         * @return The documentType         */        public Object getDocumentType() {            return documentType;        }        /**         * @param documentType The documentType         */        public void setDocumentType(Object documentType) {            this.documentType = documentType;        }        /**         * @return The freshloan         */        public Object getFreshloan() {            return freshloan;        }        /**         * @param freshloan The freshloan         */        public void setFreshloan(Object freshloan) {            this.freshloan = freshloan;        }    }}