处理改装中的动态响应



我收到类似的json

{
  "animal" : {
    "type" : "FIRE",
    "food" : "potato",
    "water": "7up"
  }
}
---
{
  "animal" : {
    "type" : "WATER",
    "water": "7up"
  }
}
---
{
  "animal" : {
    "type" : "CYPO",
    "counter": 7
  }
}
---
{
  "animal" : {
    "type" : "UNKNOWN",
    "food": "Stup",
    "water": "Cola",
    "counter" : 4
  }
}

我是否应该创建4个数据类?我的意思是,我知道它们会是什么样子,它们不会改变,但取决于类型是否会有一些参数,所以我必须创建4个数据类吗,比如FIRE一个

data class AnimalFireResponse{
@SerializedName("type") val myEnum: MyEnum, @SerializedName("food") val food : String, @SerializedName("water") val water : String) 
}

但后来我不知道该在我的服务上放什么

@GET("/dynamic/stuff.php")
fun getAnimal(): Call<List<MyResponseWithDynamicAnimal>>

还有其他通用的方法吗?

编辑

也许这有帮助,但是,我知道所有的type值(FIRE、WATER、CYPO、UNKNOWN(,我知道它们都会返回相同的值,例如FIRE总是会返回foodwater,这对你们有帮助吗?

是的,您可以创建一个数据类来表示这个JSON。由于字段的名称不变,您可以将它们全部包括在内,并将它们标记为可为null。

我想您可以创建一个包含所有可能字段的数据类,并相应地使用这些字段。我的意思是:

data class AnimalResponse{
@SerializedName("type") val myEnum: MyEnum, 
@SerializedName("food") val food : String= "",
@SerializedName("water") val water : String= "",
@SerializedName("counter") val counter : Integer = -1) 
}

如果您的响应不包含字段,它将使用默认值进行初始化,您可以在代码中检查该值。然而,我觉得API结构可能没有得到很好的优化。(我可能错了,我不是这方面的专家(

如果可以为null则使用以下DTO

 data class AnimalResponse(
  val type: String?, 
  val food : String?,
  val water : String?,
  val counter : Integer?
 )  

最新更新