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; } }}