android - 如何在 Retrofit 中获取正确的数据
问题描述
我有 JSON 模型,
{
"legends": {
"all": {
"Revenant": {
"ImgAssets": {
"icon": "https:\/\/api.mozambiquehe.re\/assets\/icons\/revenant.png",
"banner": "https:\/\/api.mozambiquehe.re\/assets\/banners\/revenant.jpg"
}
},
"Crypto": {
"ImgAssets": {
"icon": "https:\/\/api.mozambiquehe.re\/assets\/icons\/crypto.png",
"banner": "https:\/\/api.mozambiquehe.re\/assets\/banners\/crypto.jpg"
}
},
"Horizon": {
"data": [
{
"name": "Season 7 wins",
"value": 1,
"key": "wins_season_7",
"rank": {
"rankPos": 62637,
"topPercent": 69.39
},
"rankPlatformSpecific": {
"rankPos": 56257,
"topPercent": 68.58
}
},
{
"name": "Special event kills",
"value": 101,
"key": "specialEvent_kills",
"rank": {
"rankPos": 101058,
"topPercent": 65.11
},
"rankPlatformSpecific": {
"rankPos": 68184,
"topPercent": 61.62
}
},
{
"name": "Special event damage",
"value": 47004,
"key": "specialEvent_damage",
"rank": {
"rankPos": 96259,
"topPercent": 58.78
},
"rankPlatformSpecific": {
"rankPos": 66031,
"topPercent": 55.63
}
}
],
"ImgAssets": {
"icon": "https:\/\/api.mozambiquehe.re\/assets\/icons\/horizon.png",
"banner": "https:\/\/api.mozambiquehe.re\/assets\/banners\/horizon.jpg"
}
},
"Wraith": {
"data": [
{
"name": "Kills",
"value": 1356,
"key": "kills",
"rank": {
"rankPos": 162196,
"topPercent": 12.69
},
"rankPlatformSpecific": {
"rankPos": 121593,
"topPercent": 10.29
}
},
{
"name": "Season 7 kills",
"value": 233,
"key": "kills_season_7",
"rank": {
"rankPos": 17859,
"topPercent": 38.15
},
"rankPlatformSpecific": {
"rankPos": 15854,
"topPercent": 36.65
}
},
{
"name": "Season 7 wins",
"value": 13,
"key": "wins_season_7",
"rank": {
"rankPos": 11891,
"topPercent": 13.97
},
"rankPlatformSpecific": {
"rankPos": 10926,
"topPercent": 13.47
}
},
{
"name": "Special event kills",
"value": 1377,
"key": "specialEvent_kills",
"rank": {
"rankPos": "NOT_CALCULATED_YET",
"topPercent": "NOT_CALCULATED_YET"
},
"rankPlatformSpecific": {
"rankPos": "NOT_CALCULATED_YET",
"topPercent": "NOT_CALCULATED_YET"
}
},
{
"name": "Special event damage",
"value": 656195,
"key": "specialEvent_damage",
"rank": {
"rankPos": "NOT_CALCULATED_YET",
"topPercent": "NOT_CALCULATED_YET"
},
"rankPlatformSpecific": {
"rankPos": "NOT_CALCULATED_YET",
"topPercent": "NOT_CALCULATED_YET"
}
},
{
"name": "Special event wins",
"value": 68,
"key": "specialEvent_wins",
"rank": {
"rankPos": "NOT_CALCULATED_YET",
"topPercent": "NOT_CALCULATED_YET"
},
"rankPlatformSpecific": {
"rankPos": "NOT_CALCULATED_YET",
"topPercent": "NOT_CALCULATED_YET"
}
}
],
"ImgAssets": {
"icon": "https:\/\/api.mozambiquehe.re\/assets\/icons\/wraith.png",
"banner": "https:\/\/api.mozambiquehe.re\/assets\/banners\/wraith.jpg"
}
}
}
}
}
然后我做一个数据类:
data class TestHero (@SerializedName("global") val global: PlayerInf,
@SerializedName("legends")val legends: AllLegends)
data class PlayerInf (val name: String, val uid: Long, val avatar: String, val platform: String,
val level: Int, val toNextLevelPercent: Int, val internalUpdateCount: Int, val bans: BanInf, val rank: RankInf)
data class BanInf (val isActive: Boolean, val remainingSeconds: Int)
data class RankInf (val rankScore: Int, val rankName: String, val rankDiv: Int, val rankImg: String)
data class AllLegends (@SerializedName("all") val all : Revenant, @SerializedName("all")val all2: Horizon)
data class Revenant (val ImgAssets: String)
data class Horizon (val data : ArrayList<Rang0>, val ImgAssets: String)
class Legends(){
data class Revenant (val ImgAssets: String)
data class Horizon (val data : ArrayList<Rang0>, val ImgAssets: String)
}
data class Rang (val t0 : Rang0)
data class Rang0 (val name: String, val value: Int, val key: String)
但我得到了错误:
无法为类创建转换器
在寻找 stackoverflow 的答案后,我意识到您不能对类对象进行双重序列化。但是你如何获得数据呢?我试图单独做,但结果只得到了 1 个对象示例的数据:
data class AllLegends (@SerializedName("all") val all : Revenant)
请帮我弄清楚
解决方案
我认为这是已定义对象的地图,但每个图例都是未定义的
data class Legends(
val all: Map<String, LegendWrapper> = emptyMap()
)
data class LegendWrapper(
val data: Lis<PlayerPerformance>? = emptyList(),
val ImgAssets: ImgAssets? = null
)
所以你可以定义一个类PlayerPerformance
,ImgAssets
但不能定义每个“图例”,因为每个“图例”的键都不是静态的,这就是映射的原因。
并且LegendWrapper
您必须将data
and定义ImgAssets
为可空值,因为某些“图例”没有它们。
这种方式在Legends
你里面不需要Ravenant, Crypto, Horizon...
等等。
推荐阅读
- angular - 如何在角度中添加带有字符串插值的routerlink
- r - ggplot 从堆积条形图中更改一个条形的颜色
- c# - 将ajax返回的数据绑定到aspx
- android - 无法在android中将pdf或docx文件转换为base64
- python - 有没有办法根据另一个张量变量的值来命名张量流变量
- entity-framework-core - ASP.NET Core 2.1 Entity Framework Core 相关数据复制
- php - 如果为空,则使用 PHP 隐藏和删除行
- php - PHP exec() 和文件系统权限
- c# - 从 Razor 页面模型调用带有依赖注入的 HomeController 操作
- ember.js - EmberJS:如何更新基于 Ember CLI 的应用程序