如何使用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的一部分