如何无需手动解析将Kotlin数据类的字符串表示转回实例?
在Kotlin中无需手动解析实现数据类字符串与实例互转
别用toString()的输出做反序列化——这个方法生成的字符串是给人阅读用的,没有统一标准格式,Kotlin版本迭代后甚至可能改变输出结构,根本没法可靠地转回实例。要实现无需手动解析的互转,直接用成熟的序列化库即可,下面是两种常用方案:
方案一:Kotlinx Serialization(官方推荐)
这是JetBrains官方推出的序列化库,对Kotlin特性支持最友好。
步骤1:引入依赖
以Android或JVM项目为例,在Gradle配置中添加依赖:
// 项目根目录build.gradle.kts plugins { kotlin("plugin.serialization") version "1.9.20" } // 模块build.gradle.kts dependencies { implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.0") }
步骤2:给类添加序列化注解
给枚举和数据类加上@Serializable注解:
import kotlinx.serialization.Serializable @Serializable enum class Interest { SPORTS, TECH, ART } @Serializable enum class EmploymentType { FULL_TIME, PART_TIME, FREELANCE } @Serializable data class DataFilter(val mainInterest: Interest, val employments: List<EmploymentType>)
步骤3:序列化与反序列化
用Json工具类完成互转,生成标准JSON格式字符串替代toString()的非标准输出:
import kotlinx.serialization.json.Json fun main() { // 创建实例 val filter = DataFilter(Interest.TECH, listOf(EmploymentType.FULL_TIME, EmploymentType.FREELANCE)) // 序列化(替代toString()) val jsonStr = Json.encodeToString(filter) println(jsonStr) // 输出:{"mainInterest":"TECH","employments":["FULL_TIME","FREELANCE"]} // 反序列化转回实例 val parsedFilter = Json.decodeFromString<DataFilter>(jsonStr) println(parsedFilter.mainInterest) // 输出:TECH }
方案二:Gson
Google的Gson库兼容性强,适合Java/Kotlin混合项目。
步骤1:引入依赖
// 模块build.gradle.kts dependencies { implementation("com.google.code.gson:gson:2.10.1") }
步骤2:直接序列化与反序列化
Gson对枚举和数据类的支持无需额外注解(复杂场景可加@SerializedName自定义字段名):
import com.google.gson.Gson fun main() { val filter = DataFilter(Interest.ART, listOf(EmploymentType.PART_TIME)) // 序列化 val gson = Gson() val jsonStr = gson.toJson(filter) println(jsonStr) // 输出:{"mainInterest":"ART","employments":["PART_TIME"]} // 反序列化 val parsedFilter = gson.fromJson(jsonStr, DataFilter::class.java) println(parsedFilter.employments) // 输出:[PART_TIME] }
注意事项
如果已经有了toString()生成的非标准字符串(比如DataFilter(mainInterest=TECH, employments=[FULL_TIME, FREELANCE])),没办法用库直接反序列化——这种格式没有统一规范,只能手动解析。建议从一开始就用序列化库生成标准格式字符串,避免后续麻烦。
内容的提问来源于stack exchange,提问作者API_1024
相关产品推荐
相关产品推荐

