Gson → kotlinx.serialization
老写法(Java + Gson)
1Gson gson = new Gson(); 2 3// 序列化 4Item item = new Item(1, "商品", 9.99); 5String json = gson.toJson(item); 6 7// 反序列化 8Item parsed = gson.fromJson(json, Item.class); 9List<Item> list = gson.fromJson(jsonArray, 10 new TypeToken<List<Item>>(){}.getType()); 11
问题在哪里
Gson 基于反射,Kotlin 的 data class 用 Gson 会碰到 null 安全问题——Gson 可以绕过 Kotlin 的非 null 检查给一个字段设为 null。Kotlin 默认参数也不被 Gson 识别。
新写法(kotlinx.serialization)
1@Serializable 2data class Item( 3 val id: Long, 4 val name: String, 5 val price: Double = 0.0 6) 7 8val json = Json { ignoreUnknownKeys = true; coerceInputValues = true } 9 10// 序列化 11val jsonString = json.encodeToString(Item(1, "商品", 9.99)) 12 13// 反序列化 14val item = json.decodeFromString<Item>(jsonString) 15val list = json.decodeFromString<List<Item>>(jsonArray) 16
一句话注意
kotlinx.serialization 不依赖反射,编译期生成序列化代码。Kotlin 的非 null 类型和默认参数都被正确处理——JSON 里缺了 price 字段就用默认值 0.0,而不是 Gson 那样的 null。
coerceInputValues = true 是 Kotlin 2.x 新增的配置,遇到 JSON null 值会自动用默认值替代,不会抛异常。Gson 迁移时如果不想改所有调用方,可以加这个配置兼容。
Java Android 老项目迁移系列,持续更新中。
《Gson → kotlinx.serialization》 是转载文章,点击查看原文。