Kotlin序列化配置与JSON处理实践指南

Kotlin序列化配置与JSON处理实践指南 1. Kotlin Serialization 基础配置1.1 依赖引入与插件配置在Kotlin项目中使用Serialization需要先配置相关依赖。对于Gradle构建的项目需要在项目级和模块级的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) }这里有几个关键点需要注意插件版本必须与Kotlin编译器版本保持一致序列化插件需要在所有使用它的模块中启用对于Android项目还需要确保启用了Kotlin的元编程支持提示如果遇到Unresolved reference: serialization错误请检查是否在项目级build.gradle中正确应用了插件。1.2 基础数据类定义定义一个可序列化的数据类非常简单只需要添加Serializable注解import kotlinx.serialization.Serializable Serializable data class User( val id: Int, val name: String, val email: String? null, // 可空类型 SerialName(created_at) val createTime: Long // 自定义JSON字段名 )这个简单的数据类已经包含了几个重要特性空安全处理email字段默认值email默认为null字段名映射created_at映射到createTime2. JSON序列化核心操作2.1 基本序列化与反序列化使用Json对象进行基础转换操作import kotlinx.serialization.encodeToString import kotlinx.serialization.decodeFromString import kotlinx.serialization.json.Json val json Json { ignoreUnknownKeys true // 重要配置忽略未知字段 isLenient true // 允许非严格JSON格式 } // 序列化 val user User(1, Alice, aliceexample.com, System.currentTimeMillis()) val jsonString json.encodeToString(user) // 反序列化 val parsedUser json.decodeFromStringUser(jsonString)2.2 高级配置选项Json构建器支持多种配置选项val customJson Json { encodeDefaults true // 序列化默认值 explicitNulls false // 不序列化null值 coerceInputValues true // 使用默认值处理缺失字段 allowStructuredMapKeys true // 允许复杂类型作为Map键 prettyPrint true // 美化输出 useArrayPolymorphism true // 多态数组处理 }这些配置项的组合可以满足绝大多数业务场景的需求。例如在API开发中通常会设置ignoreUnknownKeys true兼容API字段增减explicitNulls false减少传输数据量coerceInputValues true保证数据完整性3. 复杂场景处理3.1 自定义序列化器对于特殊类型如Date需要实现KSerializer接口import kotlinx.serialization.* import java.time.LocalDate import java.time.format.DateTimeFormatter object LocalDateSerializer : KSerializerLocalDate { private val formatter DateTimeFormatter.ISO_LOCAL_DATE override val descriptor: SerialDescriptor PrimitiveSerialDescriptor(LocalDate, PrimitiveKind.STRING) override fun serialize(encoder: Encoder, value: LocalDate) { encoder.encodeString(formatter.format(value)) } override fun deserialize(decoder: Decoder): LocalDate { return LocalDate.parse(decoder.decodeString(), formatter) } } Serializable data class Event( val name: String, Serializable(with LocalDateSerializer::class) val date: LocalDate )3.2 多态类型处理处理继承体系时需要使用Polymorphic注解Serializable abstract class Response Serializable SerialName(success) data class SuccessResponse(val data: String) : Response() Serializable SerialName(error) data class ErrorResponse(val code: Int, val message: String) : Response() val json Json { classDiscriminator type // 类型标识字段名 serializersModule SerializersModule { polymorphic(Response::class) { subclass(SuccessResponse::class) subclass(ErrorResponse::class) } } }4. 性能优化与生产实践4.1 缓存序列化器实例对于高性能场景应该重用Json实例object JsonSerializer { val defaultJson Json { ignoreUnknownKeys true coerceInputValues true } private val cachedSerializers mutableMapOfKClass*, KSerializer*() fun T : Any getSerializer(kClass: KClassT): KSerializerT { return cachedSerializers.getOrPut(kClass) { kClass.serializer() } as KSerializerT } }4.2 流式处理大JSON对于大文件处理可以使用Json.decodeFromStreamfun parseLargeJsonFile(file: File): ListUser { return file.inputStream().use { stream - Json.decodeFromStreamListUser(stream) } }4.3 Android混淆配置在proguard-rules.pro中添加-keep class kotlinx.serialization.** { *; } -keepclasseswithmembers class * { kotlinx.serialization.Serializable fields; }5. 常见问题排查5.1 序列化失败场景缺少Serializable注解尝试序列化非数据类属性可见性不是public使用了不支持的类型如Java集合类5.2 性能问题诊断避免频繁创建Json实例对于复杂对象考虑预编译序列化器大文件使用流式处理注意后端服务的JSON处理能力5.3 与其他库的兼容性与Retrofit配合使用时需要添加转换器implementation(com.jakewharton.retrofit:retrofit2-kotlinx-serialization-converter:1.0.0)与Spring Boot集成时需要配置HttpMessageConverter在实际项目中我通常会建立一个serialization模块集中管理所有序列化相关配置包括自定义序列化器公共Json配置类型别名定义跨模块共享的数据模型这种集中管理的方式可以确保整个项目使用一致的序列化策略避免因配置不一致导致的问题。