首页 > 解决方案 > 如何在 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) 请帮我弄清楚

标签: androidkotlinretrofit2

解决方案


我认为这是已定义对象的地图,但每个图例都是未定义的

data class Legends(
    val all: Map<String, LegendWrapper> = emptyMap()
)
data class LegendWrapper(
    val data: Lis<PlayerPerformance>? = emptyList(),
    val ImgAssets: ImgAssets? = null

)

所以你可以定义一个类PlayerPerformanceImgAssets但不能定义每个“图例”,因为每个“图例”的键都不是静态的,这就是映射的原因。

并且LegendWrapper您必须将dataand定义ImgAssets为可空值,因为某些“图例”没有它们。

这种方式在Legends你里面不需要Ravenant, Crypto, Horizon...等等。


推荐阅读