【问题标题】:get object inside every call Retrofit在每个调用 Retrofit 中获取对象
【发布时间】:2017-09-01 22:57:21
【问题描述】:

我正在使用 Retrofit 和 RxJava 与 API 集成,每个 api 响应都是这样的:

{"success":true,"message":null,"object":{"bla":"String", "bla1":1}}

唯一改变的是object,我尝试创建一个“ResponseBase”,每个模型都扩展它,并创建一个“Response”,这就是 api 将返回的内容

public class Response {
    public Boolean success;
    public String message;
    public ResponseBase object;
}

为了获得我想要的对象类型,我只需输入 .map

//VehicleResponseModel extends ResponseBase

VehicleResponseModel vec = (VehicleResponseModel) response.getObject();

但是发生了这个错误:

ResponseBase 不能转换为 VehicleResponseModel

我没有明确的方法来做到这一点。

【问题讨论】:

    标签: retrofit rx-java retrofit2 rx-android


    【解决方案1】:

    为此使用泛型:

    public class Response<T> { public Boolean success; public String message; public T object; } 并让你的改造返回Response&lt;VehicleResponseModel&gt;,这样你就可以从中检索你的VehicleResponseModel

    【讨论】:

    • 出现这个错误:java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to VehicleResponseModel
    【解决方案2】:

    我认为问题出在你的继承模型上:

    这应该是你的父类:

    public class Response {
        public Boolean success;
        public String message;
    }
    

    这可能是子类之一(代表包含的数据模型):

    public class SomeResponse extends Response {
    
        public InnerModel object;
    
        public static class InnerModel {
            public String bla;
            public int bla1; 
        }
    }
    

    然后,当您收到 SomeResponse 的实例时,您可以轻松访问例如someResponse.object.bla1.

    【讨论】:

    • 你为什么要说服他他正试图用继承/做正确的事情?只是去仿制药
    • 我不是想说服他做任何事?我只是指出目前他的继承是错误的。我正在介绍一种他可以修复它的方法,泛型是另一种很好的方法。选择其中一个真的取决于他的需求和喜欢的风格。
    • 使用泛型会发生这种情况:LinkedTreeMap cannot be cast to VehicleResponseModel
    【解决方案3】:

    如果您打算使用泛型,您应该阅读以下内容:Serializing and Deserializing Generic Types

    或者您可以选择上面提到的 Bartek 答案。

    public class ResponseBase {
        public Boolean success;
        public String message;
    }
    
    public class VehicleResponseModel extends ResponseBase {
        //Your custom vehicle model
    }
    

    然后让你的改造接口返回 VehicleResponseModel。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-21
      • 2014-01-04
      • 1970-01-01
      • 2017-11-25
      • 2019-08-26
      • 2016-04-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多