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

相关推荐
淡淡的香烟10 分钟前
Android中tcp的通信
android·物联网·tcp/ip
Escalating_xu1 小时前
【C++入门基础(下)】默认参数、函数重载、引用、inline 与 nullptr
android·c++·redis
丘山一郎9 小时前
Spring 中的IOC控制反转 和DI依赖注入
java·后端·spring
码视野9 小时前
基于 Spring Boot + Vue3 的【大学英语四六级 (CET-4/6) 作文智能评分与句式润色系统】设计与实现(含PRD/三端高保真源码/大屏)
java·前端·人工智能·spring boot·后端·vue3
MetaLite9 小时前
Spring-AOP自调用为什么失效-AopContext真能解决吗
java·后端·spring
大模型码小白9 小时前
AI 对话流性能调优:万级消息的虚拟滚动落地
java·大数据·前端·javascript·人工智能·算法·机器学习
许彰午9 小时前
14-字段级SM4加密与SM2签名
java·低代码·架构
许彰午11 小时前
13-describe元数据输出
java·低代码·架构·状态模式
用户37215742613512 小时前
Java 设置 Word 文档编辑限制并允许指定区域编辑
java
wen_zhufeng12 小时前
用 vLLM 加速 TTS 推理:通用改造指南
android·vllm