Retrofit中如何获取正确的数据
How to get the correct data in 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"
}
}
}
}
}
然后我做一个数据class:
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)
但是我得到错误:
Unable to create converter for class
在寻找 Whosebug 的答案后,我意识到您不能双重序列化 class 对象。但是你如何获得数据呢?
尝试单独做,结果只能获取到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
)
因此您可以在 class 上定义 PlayerPerformance
和 ImgAssets
但不能定义每个“图例”,因为每个图例的键不是静态的,这就是地图的原因.
并且在 LegendWrapper
中,您必须将 data
和 ImgAssets
定义为可空值,因为某些“传说”没有它们。
这样在 Legends
里面你不需要 Ravenant, Crypto, Horizon...
等等。
我有 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"
}
}
}
}
}
然后我做一个数据class:
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)
但是我得到错误:
Unable to create converter for class
在寻找 Whosebug 的答案后,我意识到您不能双重序列化 class 对象。但是你如何获得数据呢?
尝试单独做,结果只能获取到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
)
因此您可以在 class 上定义 PlayerPerformance
和 ImgAssets
但不能定义每个“图例”,因为每个图例的键不是静态的,这就是地图的原因.
并且在 LegendWrapper
中,您必须将 data
和 ImgAssets
定义为可空值,因为某些“传说”没有它们。
这样在 Legends
里面你不需要 Ravenant, Crypto, Horizon...
等等。