Сделка с динамическим c ответ в модернизации - PullRequest
0 голосов
/ 04 марта 2020

Я получаю 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>>

Есть ли какой-нибудь другой способ, как generi c?

Редактировать

Возможно, это помогает, но я знаю все значения type (FIRE, WAITER, CYPO, UNKNOWN) и знаю, что все они будут возвращать одинаковые значения, для Например, FIRE будет возвращать всегда food и water, это вам поможет, ребята?

Ответы [ 3 ]

0 голосов
/ 04 марта 2020

Полагаю, вы могли бы создать 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 не может быть хорошо оптимизирована (я могу ошибаться, я не эксперт в этом)

0 голосов
/ 04 марта 2020

Используйте следующий DTO, если nullable в порядке

 data class AnimalResponse(
  val type: String?, 
  val food : String?,
  val water : String?,
  val counter : Integer?
 )  
0 голосов
/ 04 марта 2020

Да, вы можете создать один класс данных для представления этого JSON. Поскольку имена полей не меняются, вы можете включить их все и пометить как обнуляемые.

...