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

如何无需手动解析将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 11:40:14