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
)

该类包含两个只读属性:iddescription。预期生成的 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


原始标题:Converting Kotlin Data Class from JSON using GSON

» 下一篇: Fuel HTTP 库与 Kotlin