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 上定义 PlayerPerformanceImgAssets 但不能定义每个“图例”,因为每个图例的键不是静态的,这就是地图的原因.

并且在 LegendWrapper 中,您必须将 dataImgAssets 定义为可空值,因为某些“传说”没有它们。

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