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

相关推荐
技术小结-李爽2 小时前
【工具】pom文件的<packaging>
java·maven
l156469482 小时前
突围!图文混合知识库难以解析,Kimi-K3 原生视觉架构深耕知识工作,DMXAPI 统一接口,缩短项目开发周期
java·大数据·开发语言
zzq77972 小时前
加固包闪退四象限定位:targetSdk 与保护策略实战解析
android·安全·安卓·安全架构
布吉岛的石头3 小时前
Java 程序员第 45 阶段11:网关统一路由大模型接口,配合 Nacos 配置治理,灰度路由:基于Nacos元数据实现大模型服务灰度发布与权重路由
java·服务发现
我命由我123453 小时前
Android 开发问题:Cannot resolve method ‘repeat‘ in ‘String‘
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
baozhengw4 小时前
信创改造-SpringBootJar包改为WAR包部署Tomcat
java·tomcat
M1A14 小时前
基于 Spring AOP 构建系统操作日志:从注解设计到异步落库的完整实战
java
光头闪亮亮4 小时前
Fyne ( go跨平台GUI )项目实战-scanner摄像头扫码组件开发技术详解
android·go
RainCity4 小时前
Java Swing 自定义组件库分享(十五)
java·笔记·后端
farerboy4 小时前
23-Java 构造函数
java·后端