处理改造中的动态响应

时间:2020-03-04 15:42:07

标签: android json kotlin retrofit retrofit2

我正在接收这样的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,WAITER,CYPO,UNKNOWN),而且我知道所有这些值都将返回相同的值,例如FIRE将始终返回{ {1}}和food,对您有帮助吗?

3 个答案:

答案 0 :(得分:0)

是的,您可以创建一个数据类来表示此JSON。 由于字段名称不变,因此您可以全部包含它们并将其标记为可空。

答案 1 :(得分:0)

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

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结构可能没有得到很好的优化。(我可能是错的,我不是专家)

答案 2 :(得分:0)

如果可以为空,则使用以下DTO

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