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 老项目迁移系列,持续更新中。