You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否使用Gson库解析JSON至普通类而非数据类?

用Gson搭配普通类解析JSON & 避免重复定义类的方案

一、完全可以用普通类替代数据类解析JSON

Gson根本不强制要求用数据类(data class),普通Kotlin类照样能搞定JSON解析,只是要注意几个小细节就行。

给你写个实际的普通类示例:

// 普通Address类,去掉data关键字即可
class Address {
    var city: String? = null
    var post: String? = null
}

// 普通Student类
class Student {
    var name: String? = null
    var address: Address? = null
}

// 解析代码和你用数据类的时候一模一样
val json = """
{
  "name": "Alex",
  "address": {
    "city": "Rome",
    "post": "1000"
  }
}
"""
val student = Gson().fromJson<Student>(json, Student::class.java)
println(student.address?.city) // 照样输出 "Rome"

Gson底层靠反射工作:它会找到类的无参构造函数(Kotlin普通类默认自带,除非你自己写了带参构造覆盖),然后通过成员变量的setter方法赋值,和数据类的解析逻辑本质一致。

二、解决重复定义类的核心方案:把类放到公共文件/包中

你不想在每个文件重复写这些类?这太好办了——把这些类(不管是数据类还是普通类)单独放在一个公共的包或文件里,其他需要用的地方直接导入就行,根本不用重复定义。

举个清晰的项目结构例子:

你的项目
└── src/main/kotlin
    └── com/yourproject
        ├── models  // 专门放实体类的公共包,所有业务都能共用
        │   ├── Address.kt
        │   └── Student.kt
        ├── HomeScreen.kt  // 业务文件1
        └── ProfileScreen.kt  // 业务文件2

然后在models包下的文件里定义你的类:

// Address.kt
package com.yourproject.models

data class Address(
  var city: String? = null,
  var post: String? = null
)
// Student.kt
package com.yourproject.models

data class Student(
  var name: String? = null,
  var address: Address? = null
)

之后在任何业务文件里,只需要导入就能直接用:

// HomeScreen.kt
package com.yourproject

import com.yourproject.models.Student
import com.google.gson.Gson

fun handleJson() {
    val json = """..."""
    val student = Gson().fromJson<Student>(json, Student::class.java)
    // 正常使用student对象即可
}

这样不管多少个文件需要用这些类,都只需要一行导入,完全不用重复写定义。

如果你的项目是多模块结构,还可以把这些实体类放到一个单独的common模块里,让其他业务模块依赖这个common模块,跨模块也能复用,灵活性更高。

内容的提问来源于stack exchange,提问作者XCarb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:43:39