如何使用RetrofitKotlin只提取Json文件的一个对象或数组?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用RetrofitKotlin只提取Json文件的一个对象或数组?相关的知识,希望对你有一定的参考价值。

我是oop和android开发的新手,我想只提取这个json文件的一小部分,我想只得到 "重量级 "的排名,没有其他重量级的划分。任何帮助将被高度赞赏!这是我的模型。

data class Rankings(
    @SerializedName("rankings")
    val rankings: List<Ranking>
)
data class Ranking(
    @SerializedName("competitor_rankings")
    val competitorRankings: List<CompetitorRanking>,
    @SerializedName("name")
    val name: String,
    @SerializedName("type_id")
    val typeId: Int,
    @SerializedName("week")
    val week: Int,
    @SerializedName("year")
    val year: Int
)
data class CompetitorRanking(
    @SerializedName("competitor")
    val competitor: Competitor,
    @SerializedName("rank")
    val rank: Int
)
data class Competitor(
    @SerializedName("abbreviation")
    val abbreviation: String,
    @SerializedName("id")
    val id: String,
    @SerializedName("name")
    val name: String
)

这是我的api接口:

    @GET("ufc/trial/v2/en/rankings.json")
    suspend fun getRankings(@Query("api_key") api_key: String): Rankings

    companion object {

        fun create(): ApiInterface {
            val retrofit = Retrofit.Builder()
                .baseUrl("https://api.sportradar.us/")
                .addCallAdapterFactory(CoroutineCallAdapterFactory.invoke())
                .addConverterFactory(GsonConverterFactory.create())
                .build()
            return retrofit.create(ApiInterface::class.java)
        }

    }

}

这是我的api调用:

lifecycleScope.launch(Dispatchers.IO) {
            val result = api.getRankings("MY_API_KEY_WILL_GO_HERE")
            Log.d(TAG,"${result.rankings}")
        }

这是我的json文件(因为字符限制,我不能把整个东西贴出来,但本质上只是8个多的排名数组)。

"rankings": [
        {
            "type_id": 8,
            "name": "pound_for_pound",
            "year": 2020,
            "week": 21,
            "competitor_rankings": [
                {
                    "rank": 1,
                    "movement": 0,
                    "competitor": {
                        "id": "sr:competitor:253371",
                        "name": "Jones, Jon",
                        "abbreviation": "JON"
                    }
                },
                {
                    "rank": 2,
                    "movement": 0,
                    "competitor": {
                        "id": "sr:competitor:250879",
                        "name": "Nurmagomedov, Khabib",
                        "abbreviation": "NUR"
                    }
                },
                {
                    "rank": 3,
                    "movement": 1,
                    "competitor": {
                        "id": "sr:competitor:237684",
                        "name": "Miocic, Stipe",
                        "abbreviation": "MIO"
                    }
                },
                {
                    "rank": 4,
                    "movement": 1,
                    "competitor": {
                        "id": "sr:competitor:410485",
                        "name": "Adesanya, Israel",
                        "abbreviation": "ADE"
                    }
                },
                {
                    "rank": 5,
                    "movement": 1,
                    "competitor": {
                        "id": "sr:competitor:253373",
                        "name": "Cormier, Daniel",
                        "abbreviation": "COR"
                    }
                },
                {
                    "rank": 6,
                    "movement": 1,
                    "competitor": {
                        "id": "sr:competitor:273539",
                        "name": "Usman, Kamaru",
                        "abbreviation": "USM"
                    }
                },
                {
                    "rank": 7,
                    "movement": 1,
                    "competitor": {
                        "id": "sr:competitor:290262",
                        "name": "Volkanovski, Alex",
                        "abbreviation": "VOL"
                    }
                },
                {
                    "rank": 8,
                    "movement": 1,
                    "competitor": {
                        "id": "sr:competitor:237676",
                        "name": "McGregor, Conor",
                        "abbreviation": "MCG"
                    }
                },
                {
                    "rank": 9,
                    "movement": 1,
                    "competitor": {
                        "id": "sr:competitor:237652",
                        "name": "Holloway, Max",
                        "abbreviation": "HOL"
                    }
                },
                {
                    "rank": 10,
                    "movement": 1,
                    "competitor": {
                        "id": "sr:competitor:351762",
                        "name": "Gaethje, Justin",
                        "abbreviation": "GAE"
                    }
                },
                {
                    "rank": 11,
                    "movement": 1,
                    "competitor": {
                        "id": "sr:competitor:261799",
                        "name": "Poirier, Dustin",
                        "abbreviation": "POI"
                    }
                },
                {
                    "rank": 12,
                    "movement": 1,
                    "competitor": {
                        "id": "sr:competitor:237646",
                        "name": "Ferguson, Tony",
                        "abbreviation": "FER"
                    }
                },
                {
                    "rank": 13,
                    "movement": 1,
                    "competitor": {
                        "id": "sr:competitor:253377",
                        "name": "Whittaker, Robert",
                        "abbreviation": "WHI"
                    }
                },
                {
                    "rank": 14,
                    "movement": 1,
                    "competitor": {
                        "id": "sr:competitor:274653",
                        "name": "Woodley, Tyron",
                        "abbreviation": "WOO"
                    }
                },
                {
                    "rank": 15,
                    "movement": 0,
                    "competitor": {
                        "id": "sr:competitor:250145",
                        "name": "Ngannou, Francis",
                        "abbreviation": "NGA"
                    }
                }
            ]
        },
        {
"type_id": 16,
            "name": "heavyweight",
            "year": 2020,
            "week": 21,
            "competitor_rankings": [
                {
                    "rank": 0,
                    "movement": 0,
                    "competitor": {
                        "id": "sr:competitor:237684",
                        "name": "Miocic, Stipe",
                        "abbreviation": "MIO"
                    }
                },
                {
                    "rank": 1,
                    "movement": 0,
                    "competitor": {
                        "id": "sr:competitor:253373",
                        "name": "Cormier, Daniel",
                        "abbreviation": "COR"
                    }
                },
                {
                    "rank": 2,
                    "movement": 0,
                    "competitor": {
                        "id": "sr:competitor:250145",
                        "name": "Ngannou, Francis",
                        "abbreviation": "NGA"
                    }
                },
                {
                    "rank": 3,
                    "movement": 0,
                    "competitor": {
                        "id": "sr:competitor:542009",
                        "name": "Blaydes, Curtis",
                        "abbreviation": "BLA"
                    }
                },
                {
                    "rank": 4,
                    "movement": 0,
                    "competitor": {
                        "id": "sr:competitor:237636",
                        "name": "Dos Santos, Junior",
                        "abbreviation": "DOS"
                    }
                },
                {
                    "rank": 4,
                    "movement": 1,
                    "competitor": {
                        "id": "sr:competitor:542099",
                        "name": "Lewis, Derrick",
                        "abbreviation": "LEW"
                    }
                },
                {
                    "rank": 6,
                    "movement": 0,
                    "competitor": {
                        "id": "sr:competitor:542143",
                        "name": "Rozenstruik, Jairzinho",
                        "abbreviation": "ROZ"
                    }
                },
                {
                    "rank": 7,
                    "movement": 0,
                    "competitor": {
                        "id": "sr:competitor:542161",
                        "name": "Volkov, Alexander",
                        "abbreviation": "VOL"
                    }
                },
                {
                    "rank": 8,
                    "movement": 0,
                    "competitor": {
                        "id": "sr:competitor:237694",
                        "name": "Overeem, Alistair",
                        "abbreviation": "OVE"
                    }
                },
                {
                    "rank": 9,
                    "movement": 0,
                    "competitor": {
                        "id": "sr:competitor:254231",
                        "name": "Harris, Walt",
                        "abbreviation": "HAR"
                    }
                },
                {
                    "rank": 10,
                    "movement": 0,
                    "competitor": {
                        "id": "sr:competitor:542117",
                        "name": "Oleinik, Aleksei",
                        "abbreviation": "OLE"
                    }
                },
                {
                    "rank": 11,
                    "movement": 0,
                    "competitor": {
                        "id": "sr:competitor:244080",
                        "name": "Abdurakhimov, Shamil",
                        "abbreviation": "ABD"
                    }
                },
                {
                    "rank": 12,
                    "movement": 0,
                    "competitor": {
                        "id": "sr:competitor:542079",
                        "name": "Ivanov, Blagoy",
                        "abbreviation": "IVA"
                    }
                },
                {
                    "rank": 13,
                    "movement": 0,
                    "competitor": {
                        "id": "sr:competitor:542145",
                        "name": "Sakai, Augusto",
                        "abbreviation": "SAK"
                    }
                },
                {
                    "rank": 14,
                    "movement": 0,
                    "competitor": {
                        "id": "sr:competitor:515358",
                        "name": "Pavlovich, Sergey",
                        "abbreviation": "PAV"
                    }
                },
                {
                    "rank": 15,
                    "movement": 0,
                    "competitor": {
                        "id": "sr:competitor:257349",
                        "name": "Werdum, Fabricio",
                        "abbreviation": "WER"
                    }
                }
            ]
        },
答案

你可以直接使用 List.first 方法。

lifecycleScope.launch(Dispatchers.IO) {
    val result = api.getRankings("MY_API_KEY_WILL_GO_HERE")
    val ranking = result.rankings.first { it.name == "heavyweight" }
}
另一答案

rankings.filter { it.name == "heavyweight" } 会给你一个重量级的排名列表。但如果你的API有办法在服务器端过滤这些结果,即在你的请求中添加一些过滤参数,而不是在客户端获取所有结果并进行过滤,那就会好很多。

以上是关于如何使用RetrofitKotlin只提取Json文件的一个对象或数组?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Swift 中的加密 JSON 字符串中提取某些字段?

Json, Java, Parsing(如何只获取json的一部分

Jmeter提取器-正则,json,xpath,边界值提取器

从struct中的struct中提取JSON数据

使用 XSLT 从 JSON 输出中提取特定字段

如何使用 swift 从 JSON 中提取数据