1. 概述
本文将演示如何在 Kotlin 中利用 Gson 库,实现 data class 与 JSON 字符串之间的双向转换。✅
虽然 Gson 是 Java 编写的库,但在 Kotlin 中使用几乎无缝,不过有几个坑需要注意,尤其是构造函数参数默认值和不可变属性的处理。
2. Maven 依赖
使用前先引入 Gson 的 Maven 依赖:
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.5</version>
</dependency>
⚠️ 注意:Kotlin 使用 Gson 时,如果涉及泛型或复杂嵌套结构,建议额外引入 kotlin-reflect
避免反射相关问题。
3. Kotlin Data Class 定义
我们定义一个简单的 data class 用于后续序列化与反序列化:
data class TestModel(
val id: Int,
val description: String
)
该类包含两个只读属性:id
和 description
。预期生成的 JSON 格式为:
{"id":1,"description":"Test"}
✅ 提示:Kotlin 的 data class 自动生成 toString()
、equals()
、hashCode()
和 copy()
,非常适合做 DTO。
4. 将 Data Class 转换为 JSON 字符串
使用 Gson 实例调用 toJson()
方法即可完成序列化:
val gson = Gson()
val jsonString = gson.toJson(TestModel(1, "Test"))
assertEquals(jsonString, """{"id":1,"description":"Test"}""")
这段代码将 TestModel
实例转为 JSON 字符串,并通过断言验证输出正确性。
⚠️ 踩坑提醒:
- 如果字段是
private
或未通过主构造函数声明,Gson 可能无法正确序列化。 - 默认情况下,Gson 不会输出值为
null
的字段,如需保留需配置GsonBuilder
。
5. 将 JSON 字符串解析为 Data Class
反向操作使用 fromJson()
方法,关键点在于传入 Java 类型信息:
val jsonString = """{"id":1,"description":"Test"}"""
val testModel = gson.fromJson(jsonString, TestModel::class.java)
assertEquals(testModel.id, 1)
assertEquals(testModel.description, "Test")
📌 为什么必须用 TestModel::class.java
?
因为 Gson 是 Java 库,它依赖的是 JVM 的 Class 对象,而 Kotlin 的 ::class
返回的是 KClass
,所以要通过 .java
获取对应的 Java Class<T>
。
❌ 常见错误写法:
gson.fromJson(jsonString, TestModel::class) // 编译报错!
✅ 正确做法始终是:
TestModel::class.java
6. 总结
本文展示了在 Kotlin 项目中使用 Gson 进行 data class 与 JSON 之间互转的基本用法。尽管 Gson 并非专为 Kotlin 设计,但在大多数场景下表现良好。
对于更复杂的场景(如默认参数、可空类型、泛型集合),建议结合 GsonBuilder
配置或考虑使用更适合 Kotlin 的替代方案,例如 kotlinx.serialization 。
所有示例代码均可在 GitHub 上找到:
https://github.com/Baeldung/kotlin-tutorials/tree/master/kotlin-json