You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用kotlinx.serialization反序列化Riot API JSON数据遇阻求助

用kotlinx.serialization处理Riot API的JSON反序列化

1. 定义英雄数据类

先创建对应单个英雄结构的Champion数据类:

import kotlinx.serialization.Serializable

@Serializable
data class Champion(
    val id: Int,
    val key: String,
    val name: String,
    val title: String
)

2. 实现自定义序列化器

核心是写一个序列化器,把JSON中data字段的键值对结构转换成List<Champion>。实现KSerializer<List<Champion>>接口,反序列化时将解析出的Map<String, Champion>转成列表即可:

import kotlinx.serialization.KSerializer
import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.descriptors.buildClassSerialDescriptor
import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder
import kotlinx.serialization.json.JsonDecoder
import kotlinx.serialization.json.jsonObject

class MapToListChampionSerializer : KSerializer<List<Champion>> {
    override val descriptor: SerialDescriptor = buildClassSerialDescriptor("MapToListChampion")

    override fun serialize(encoder: Encoder, value: List<Champion>) {
        // 若不需要序列化回JSON,此方法可留空或简单实现
        encoder.encodeSerializableValue(Champion.serializer().list, value)
    }

    override fun deserialize(decoder: Decoder): List<Champion> {
        require(decoder is JsonDecoder) { "仅支持JSON反序列化" }
        val jsonObject = decoder.decodeJsonElement().jsonObject
        // 遍历所有JSON值,反序列化为Champion实例
        return jsonObject.values.map {
            decoder.json.decodeFromJsonElement(Champion.serializer(), it)
        }
    }
}

3. 定义响应数据类

创建包含type、version和data列表的响应类,给data字段指定自定义序列化器:

import kotlinx.serialization.Serializable

@Serializable
data class ChampionResponse(
    val type: String,
    val version: String,
    @Serializable(with = MapToListChampionSerializer::class)
    val data: List<Champion>
)

4. 反序列化示例

用kotlinx.serialization.json.Json解析JSON字符串:

import kotlinx.serialization.json.Json

fun main() {
    val riotJson = """
        {   
           "type":"champion",
           "version":"6.1.1",
           "data":{   
              "Thresh":{   
                 "id":412,
                 "key":"Thresh",
                 "name":"Thresh",
                 "title":"the Chain Warden"
              },
              "Aatrox":{   
                 "id":266,
                 "key":"Aatrox",
                 "name":"Aatrox",
                 "title":"the Darkin Blade"
              }
            }
        }
    """.trimIndent()

    val response = Json.decodeFromString(ChampionResponse.serializer(), riotJson)
    println("英雄列表:${response.data}")
}

依赖配置(Gradle)

确保项目添加kotlinx.serialization依赖:

plugins {
    id 'org.jetbrains.kotlin.plugin.serialization' version '1.9.20'
}

dependencies {
    implementation 'org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.0'
}

这个思路和你提到的C#解决方案逻辑一致,都是通过自定义转换器把JSON键值对结构转成列表,不用手动处理每个英雄的键名。

内容的提问来源于stack exchange,提问作者MakiX

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 21:55:49