Gson → kotlinx.serialization

Gson → kotlinx.serialization

老写法(Java + Gson)

java 复制代码
Gson gson = new Gson();

// 序列化
Item item = new Item(1, "商品", 9.99);
String json = gson.toJson(item);

// 反序列化
Item parsed = gson.fromJson(json, Item.class);
List<Item> list = gson.fromJson(jsonArray,
        new TypeToken<List<Item>>(){}.getType());

问题在哪里

Gson 基于反射,Kotlin 的 data class 用 Gson 会碰到 null 安全问题------Gson 可以绕过 Kotlin 的非 null 检查给一个字段设为 null。Kotlin 默认参数也不被 Gson 识别。

新写法(kotlinx.serialization)

kotlin 复制代码
@Serializable
data class Item(
    val id: Long,
    val name: String,
    val price: Double = 0.0
)

val json = Json { ignoreUnknownKeys = true; coerceInputValues = true }

// 序列化
val jsonString = json.encodeToString(Item(1, "商品", 9.99))

// 反序列化
val item = json.decodeFromString<Item>(jsonString)
val list = json.decodeFromString<List<Item>>(jsonArray)

一句话注意

kotlinx.serialization 不依赖反射,编译期生成序列化代码。Kotlin 的非 null 类型和默认参数都被正确处理------JSON 里缺了 price 字段就用默认值 0.0,而不是 Gson 那样的 null。

coerceInputValues = true 是 Kotlin 2.x 新增的配置,遇到 JSON null 值会自动用默认值替代,不会抛异常。Gson 迁移时如果不想改所有调用方,可以加这个配置兼容。


Java Android 老项目迁移系列,持续更新中。

相关推荐
小bo波10 小时前
Java Swing 图形用户界面实验 —— 从算术练习到游戏开发的完整实践
java·课程设计·gui·游戏开发·扫雷·swing
咖啡八杯11 小时前
GoF设计模式——备忘录模式
java·后端·spring·设计模式
CYY9515 小时前
Compose 入门篇
android·kotlin
杉氧18 小时前
Compose 时代的 MVI 架构:如何用单向数据流驱动复杂 UI?
android·架构·android jetpack
杉氧18 小时前
Modifier 的艺术:为什么链式调用的顺序决定了UI 的生命周期?
android·架构·android jetpack
李斯维19 小时前
腾讯 XLog 日志框架 Android 端接入
android·android studio·android jetpack
黄林晴19 小时前
Kotlin Toolchain 0.11 发布:Amper 正式更名,统一 kotlin 命令
android·kotlin
雨白21 小时前
C语言基础快速入门与指针初探
android