使用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
相关产品推荐
相关产品推荐

