代码之家  ›  专栏  ›  技术社区  ›  JCarlosR

改装2的定制转换器

  •  26
  • JCarlosR  · 技术社区  · 8 年前

    我必须处理动态JSON响应。

    之前,我使用类和注释如下:

    public class ChatResponse {
    
        @SerializedName("status")
        private int status;
    
        @SerializedName("error")
        private String error;
    
        @SerializedName("response")
        private Talk response;
    
        public int getStatus() {
            return status;
        }
    
        public String getError() {
            return error;
        }
    
        public Talk getResponse() {
            return response;
        }
    }
    

    当状态为1(成功)时 onResponse 被激发,我可以得到一个ChatResponse对象。但是,当状态为0时,JSON表示中的响应为false,因此失败( onFailure 被激发)。

    我想创建自定义转换器,并且 this question 有一个很好的示例,但该示例适用于Retrofit 1。

    I have to 创建一个扩展 Converter.Factory ,但我不知道如何重写该类的方法。

    实际上我有下一个:

    @Override
    public Converter<ResponseBody, ?> fromResponseBody(Type type, Annotation[] annotations) {
    
        return super.fromResponseBody(type, annotations);
    }
    
    @Override
    public Converter<?, RequestBody> toRequestBody(Type type, Annotation[] annotations) {
    
        return super.toRequestBody(type, annotations);
    }
    

    此时我如何自己解析JSON响应?

    提前谢谢。

    4 回复  |  直到 7 年前
        1
  •  43
  •   JCarlosR    4 年前

    我正在寻找一个关于如何为Retrofit2实现自定义转换器的简单示例。不幸的是,没有找到。

    我发现 this example 但是,至少对我来说,这对我来说太复杂了。

    幸运的是,我找到了一个解决方案。

    此解决方案用于 GSON deserializers .

    我们不需要创建自定义转换器,只需要自定义 GSON converter .

    这里有一个很棒的 tutorial 。下面是我用来解析问题中描述的JSON的代码:

        2
  •  9
  •   kosiara - Bartosz Kosarzycki    7 年前

    我发现@JCarlos解决方案精确、快速且正确。我需要实施 改装2的自定义日期转换器 在Android上。您似乎需要在GSonConverterFactory中注册一个新的类型序列化程序。实施完成于 科特林 语言。

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

    以及注册:

    private fun buildGsonConverterFactory(): GsonConverterFactory {
        val gsonBuilder = GsonBuilder()
        // Custom DATE Converter for Retrofit
        gsonBuilder.registerTypeAdapter(Date::class.java, RetrofitDateSerializer())
        return GsonConverterFactory.create(gsonBuilder.create())
    }
    
    @Provides @Singleton
    internal fun providesRetrofit(applicationContext: Context): Retrofit {
        return Retrofit.Builder()
                .baseUrl(GluApp.Static.BASE_REST_URL_ADDR)
                .addConverterFactory(
                        buildGsonConverterFactory())
                .build()
    }
    
        3
  •  2
  •   Prakhar Kulshreshtha    8 年前

    编译这两个库以进行改造2

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

    像这样打给你想去的地方

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

    请求和响应的两个文件是

    文档名称

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

    文档名称响应 您可以使用 http://www.jsonschema2pojo.org/ 通过选择SourceType:JSON和Annotation Style:GSON将JSON转换为以下编写的格式

    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;
            }
    
        }
    
    }
    
        4
  •  2
  •   Andrey    6 年前

    Here 是一个例子。

    不久:

    Gson gson = new GsonBuilder()
         .registerTypeAdapter(MyClass.class, new MyClassTypeAdapter())
         .create();
    
    Retrofit retrofit = new Retrofit.Builder()  
         .baseUrl("https://api.github.com")
         .addConverterFactory(GsonConverterFactory.create(gson))
         .build();