我想在改造中使用相同的模型,以应对来自API的不同类型的响应

时间:2018-07-05 11:19:48

标签: android api jackson retrofit

我有两个具有相同外部模型的API,因此为外部模型创建了一个模型类(ResponseModel),为结果键创建了一个名为ResultModel的类,因此我可以编写所有可能的响应可能会出现在结果键上

@JsonIgnoreProperties(ignoreUnknown = true)
    public  class ResponseModel {
    @JsonProperty("code")
    private Integer code;

    @JsonProperty("message")
    private String message;

    @JsonProperty("result")
    private List<ResultModel> result;
}

在这里,我在ResultModel中添加了可能的响应 结果键将显示国家列表或州列表

@JsonIgnoreProperties(ignoreUnknown = true)
public class ResultModel {

    private Country country;

    private State state;

}

CountryList API 1结果

{ 
    "code" :102
    "message" : "message string"
    "result" : [ 
                 { "id" : 1, "name": "hello" },  
                 { "id" : 2, "name": "world" }]
}

StateList API 2结果

{ 
    "code" :101
    "message" : "message test"
    "result" : [ 
                 { "id" : 1, "name": "hello", "code" :1001 },  
                 { "id" : 2, "name": "world", "code" :1002 }]
}

我遵循此结构来重用外部模型。但它不起作用

无论如何,都可以重用ResponseModel而不为国家和州创建每个类。

2 个答案:

答案 0 :(得分:0)

实现的问题是,您正在以错误的方式构建对象,而当前类正在等待json,如下所示:

{ 
    "code" :102
    "message" : "message string"
    "result" : [ 
        {
            "country" : { "id" : 1, "name": "hello" }, 
            "state" : { "id" : 2, "name": "world", "code" :1002 }
        }
     ]
}

一个更好的选择是使用这样的泛型:

@JsonIgnoreProperties(ignoreUnknown = true)
public  class ResponseModel<T> {
  @JsonProperty("code")
  private Integer code;

  @JsonProperty("message")
  private String message;

  @JsonProperty("result")
  private List<T> result;
}

然后您可以在实现中指定您所观察的对象的类型:

ResponseModel<Country>
ResponseModel<State>

并且不再需要ResultModel类。

答案 1 :(得分:0)

您需要下面的类架构。

data class WebResponse<T>(
    val code: Int,
    val message: String,
    val result: List<T>
) {}

并致电您的服务

@GET("/countryList")
fun getCountries(): Call<WebResponse<CountryEntity>>

@GET("/stateList")
fun getStateList(): Call<WebResponse<StateEntitiy>>