JSON 转 Kotlin 数据类工具
从 JSON 生成 Kotlin data class,并附带 toJson 和 fromJson 辅助方法。
从 JSON 生成 Kotlin 数据类
在 Android 和 JVM 上,Kotlin data class 是承载 JSON 数据的天然模型类型。本工具会为每个对象生成一个 data class,使用不可变的 val 属性:整数映射为 Long,小数映射为 Double,数组映射为 List<T>,嵌套对象生成独立的 data class。生成的代码使用 Klaxon 库,并添加 toJson 方法和伴生对象中的 fromJson 函数,一次调用即可把 JSON 字符串转换为类型化对象。
使用方法
- 粘贴一段 JSON 样例,例如你的 Android 应用收到的响应。
- 输入根类名称,例如 Movie。
- 添加 Klaxon 依赖,将类粘贴到包中的 .kt 文件里,然后调用 Movie.fromJson(jsonString)。
常见问题
- 这些类可以配合 kotlinx.serialization、Moshi 或 Gson 使用吗?
- 可以。data class 声明本身是纯 Kotlin 代码。删除 Klaxon 辅助方法,并为每个类加上所用库的注解即可,例如 kotlinx.serialization 的 @Serializable。
- 可空字段如何生成?
- 在部分样例中为 null 或缺失的字段会生成为 String? 这样的可空类型,Kotlin 的空安全机制会强制你处理这些情况。
- 为什么用 Long 而不是 Int?
- JSON 整数没有大小限制,使用 Long 可以避免溢出。如果你确定取值较小,例如年份或计数,可以把属性改为 Int。
示例:JSON 转 Kotlin
输入 JSON
{
"id": 12,
"title": "Arrival",
"year": 2016,
"genres": ["sci-fi", "drama"],
"rating": 7.9
}生成的 Kotlin 代码(Movie)
// To parse the JSON, install Klaxon and do:
//
// val movie = Movie.fromJson(jsonString)
package quicktype
import com.beust.klaxon.*
private val klaxon = Klaxon()
data class Movie (
val id: Long,
val title: String,
val year: Long,
val genres: List<String>,
val rating: Double
) {
public fun toJson() = klaxon.toJsonString(this)
companion object {
public fun fromJson(json: String) = klaxon.parse<Movie>(json)
}
}