Kotlin Serialization JSON解析指南

1. 添加依赖

build.gradle.kts 中配置:

// 项目级 build.gradle.kts
plugins {
    kotlin("jvm") version "1.9.0"
    kotlin("plugin.serialization") version "1.9.0" // 应用序列化插件
}

// 模块级 build.gradle.kts
dependencies {
    implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.0")
}

2. 定义可序列化数据类

使用 @Serializable 注解标记数据类,支持 Kotlin 不可变属性和空安全:

import kotlinx.serialization.Serializable

@Serializable
data class User(
    val name: String,
    val age: Int = 18, // 默认值
    @SerialName("email_address") val email: String? // 自定义 JSON 键名
)

3. 序列化与反序列化

使用 Json 对象进行转换,支持配置选项:

import kotlinx.serialization.encodeToString
import kotlinx.serialization.decodeFromString
import kotlinx.serialization.json.Json

fun main() {
    val json = Json {
        ignoreUnknownKeys = true // 忽略未知字段
        coerceInputValues = true // 使用默认值处理缺失字段
        explicitNulls = false // 不序列化 null 值
    }

    // 序列化为 JSON 字符串
    val user = User("Alice", email = "alice@example.com")
    val jsonString = json.encodeToString(user)
    println(jsonString) // {"name":"Alice","email_address":"alice@example.com"}

    // 反序列化回对象
    val jsonInput = """{"name":"Bob","email_address":null}"""
    val decodedUser = json.decodeFromString<User>(jsonInput)
    println(decodedUser) // User(name=Bob, age=18, email=null)
}

4. 处理复杂场景

自定义序列化器

针对特殊类型(如日期),实现 KSerializer

import kotlinx.serialization.*
import kotlinx.serialization.descriptors.*
import kotlinx.serialization.encoding.*
import java.text.SimpleDateFormat
import java.util.Date

object DateSerializer : KSerializer<Date> {
    private val format = SimpleDateFormat("yyyy-MM-dd")

    override val descriptor: SerialDescriptor =
        PrimitiveSerialDescriptor("Date", PrimitiveKind.STRING)

    override fun serialize(encoder: Encoder, value: Date) {
        encoder.encodeString(format.format(value))
    }

    override fun deserialize(decoder: Decoder): Date {
        return format.parse(decoder.decodeString()) ?: throw SerializationException("Invalid date")
    }
}

@Serializable
data class Event(
    val name: String,
    @Serializable(with = DateSerializer::class) val date: Date
)
多态序列化

处理继承类时,使用 @Polymorphic

@Serializable
abstract class Response

@Serializable
@SerialName("success")
data class SuccessResponse(val data: String) : Response()

@Serializable
@SerialName("error")
data class ErrorResponse(val message: String) : Response()

// 序列化配置
val json = Json {
    classDiscriminator = "type"
    polymorphicDefault = Response.serializer()
}

5. 常见问题处理

  • 字段名映射:使用 @SerialName("json_key") 注解。
  • 默认值与空安全:配置 coerceInputValues = true 允许使用默认值填充缺失字段。
  • 混淆配置:在 ProGuard 中添加规则保持序列化类:
    -keep class com.example.model.** { *; }
    

优势总结

  • 轻量高效:无需反射,编译时生成序列化器。
  • Kotlin 原生支持:完美适配数据类、默认参数、空安全。
  • 灵活配置:通过 Json {} 配置多项策略,适应不同 JSON 结构。

通过以上步骤,可快速在 Kotlin 项目中集成 JSON 序列化功能,兼顾开发效率与运行时性能。更多细节参考 官方文档

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值