能否使用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
相关产品推荐
相关产品推荐

