Android 改造中的动态响应处理
我收到的是这样的jsonAndroid 改造中的动态响应处理,android,json,kotlin,retrofit,retrofit2,Android,Json,Kotlin,Retrofit,Retrofit2,我收到的是这样的json { "animal" : { "type" : "FIRE", "food" : "potato", "water": "7up" } } --- { "animal" : { "type" : "WATER", "water": "7up" } } --- { "animal" : { "type" : "CYPO", "counter": 7 } } --- { "animal"
{
"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>>
@GET(“/dynamic/stuff.php”)
fun getAnimal():调用
还有别的办法吗
编辑
也许这有帮助,但是,我知道所有的
类型
值(FIRE、waterer、CYPO、UNKNOWN),我知道它们都将返回相同的值,例如FIRE将始终返回食物
和水
,这对你们有帮助吗?是的,可以创建一个数据类来表示这个JSON。
由于字段的名称不变,您可以将其全部包含并将其标记为可空。我想您可以创建一个包含所有可能字段的数据类,并相应地使用这些字段。我的意思是:
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结构可能没有得到很好的优化。(我可能错了,我不是这方面的专家)如果可以使用nullable,请使用以下DTO
data class AnimalResponse(
val type: String?,
val food : String?,
val water : String?,
val counter : Integer?
)
我想避免使用可空类型,还有其他方法吗?使用可空类型是目前为止最简单的方法。如果你不喜欢使用可空类型,因为它会影响应用程序的其余部分,你可以简单地使用你在改型中使用的类型作为网络响应和应用程序类型之间的中介。你能提供一个简单的例子吗?改型会像我建议的那样返回一个具有可空值的类型。然后,您将检查这些值并将它们设置为在应用程序的其余部分中使用的任何数据类。使用Volley可以轻松完成。对不起,我使用的是改型,有什么区别吗?在改型中,我们通常创建与JSON响应映射的数据类。但是如果你使用截击,那么你可以在所有的动物对象中循环。这与放置nullable是一样的,我不是在寻找这个:(你能控制api结构吗?你能改变json响应格式吗?不,我不能这么做。我能想到的唯一一件事就是把类型字段作为其他字段的父字段,比如:animal:{type:“fire”,property:{food:“xyz”,water:“abc”}}这样你就可以拥有一个数据类animal(val类型:Enum,val属性:Any),然后有3个其他数据类,其中包含食物、水等。但是如果您无法更改API,我想这是没有用的。希望您尽快找到解决方案,抱歉:)