如何使用带有 Kotlin 的 Gson 库访问 JSON 负载中的嵌套值

我需要解析以下 JSON 负载:

{
  "status": "success","data": {
    "stats": {
      "total": 11812,"offset": 0,"limit": 50,"order": "desc","base": "USD","totalMarkets": 77573,"totalExchanges": 372,"totalMarketCap": 1692792022714.2244,"total24hVolume": 78345365115.11235
    },"base": {
      "symbol": "USD","sign": "$"
    },"coins": [
      {
        "id": 1,"uuid": "Qwsogvtv82FCd","slug": "bitcoin-btc","symbol": "BTC","name": "Bitcoin",...
}

我对“硬币”的价值有疑问:

 fun fetchJson() {
    val url = "https://api.coinranking.com/v1/public/coins"
    val request = Request.Builder().url(url).build()

    val client = OkHttpClient()
    client.newCall(request).enqueue(object: okhttp3.Callback {
        override fun onFailure(call: okhttp3.Call,e: IOException) {
            println("Failed")
        }

        override fun onResponse(call: okhttp3.Call,response: okhttp3.Response) {
            val body = response?.body?.string()
            println(body)

            val gson = GsonBuilder().create()
            val coins = gson.fromJson(body,coinrank::class.java)
            println("THESE ARE THE COINS : " +coins)
        }
    })
}
}

数据模型:

class coinrank(val status: String?,val data: Array<dataR>?)

class dataR (val coins: List<justCoin>?)

class justCoin (
    val id: Int?,val name: String?,val description: String?,val slug: String?,val symbol: String?,val iconUrl: String?
        )

出现错误:

Caused by: java.lang.IllegalStateException: Expected BEGIN_ARRAY but 在第 1 行第 29 列路径 $.data

处为 BEGIN_OBJECT

在线:val coins = gson.fromJson(body,coinrank::class.java)

我尝试将 val data: Array<dataR>? 更改为 val data: JSONObject",但仍然找不到访问这些值的方法,有人可以帮助我吗?

ly122653002 回答:如何使用带有 Kotlin 的 Gson 库访问 JSON 负载中的嵌套值

您的数据模型不适合 JSON 负载。试试下面:

data class CoinsResponse(
    val status: String,val data: CoinsData
)

data class CoinsData(
    val coins: List<Coin>
)

data class Coin(
    val id: Int,val symbol: String,val name: String
)

示例用法:

val gson = GsonBuilder().create()
val response = gson.fromJson(body,CoinsResponse::class.java)
response.data.coins.forEach(System.out::println)

上面的代码应该打印:

Coin(id=1,symbol=BTC,name=Bitcoin)
Coin(id=2,symbol=ETH,name=Ethereum)
Coin(id=8,symbol=USDT,name=Tether USD)
Coin(id=14,symbol=BNB,name=Binance Coin)
Coin(id=9,symbol=ADA,name=Cardano)
Coin(id=3,symbol=XRP,name=XRP)
...
本文链接:https://www.f2er.com/1716.html

大家都在问