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 字符串转换为类型化对象。

使用方法

  1. 粘贴一段 JSON 样例,例如你的 Android 应用收到的响应。
  2. 输入根类名称,例如 Movie。
  3. 添加 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)
    }
}

将 JSON 转换为其他语言