跳到主要内容

跨平台开发:JSON To Kotlin数据类 — Numio

根据 JSON 示例生成 Kotlin data class。整数变为 Long,小数变为 Double,嵌套对象各自生成类,数组中部分元素缺少的键变为 Boolean? 这样的可空类型。

为使用 Jackson 解析 JSON 的 Android 应用建模 REST 响应。

JSON

适用场景

  • 为使用 Jackson 解析 JSON 的 Android 应用建模 REST 响应。
  • 根据示例载荷为 Ktor 或 Spring Boot 服务创建 DTO。

使用方法

  1. 将有代表性的 JSON 对象或数组粘贴到 JSON 编辑器中;请包含能体现可选键的数组元素。
  2. 查看 Kotlin 面板:顶层类名为 Root,嵌套类按键名命名(projects 变为 Project)。
  3. 复制这些类,重命名 Root,并按 API 契约替换 Any? 或 Long。

JSON 输入

{
  "id": 1024,
  "full_name": "Ada Lovelace",
  "email": null,
  "roles": ["admin", "editor"],
  "projects": [
    { "name": "Engine", "stars": 42 },
    { "name": "Notes", "stars": 7, "archived": true }
  ]
}

Kotlin data class

import com.fasterxml.jackson.annotation.JsonProperty

data class Root(
    val id: Long,
    @JsonProperty("full_name")
    val fullName: String,
    val email: Any?,
    val roles: List<String>,
    val projects: List<Project>,
)

data class Project(
    val name: String,
    val stars: Long,
    val archived: Boolean?,
)

功能与限制

转换在浏览器中通过 json_typegen WebAssembly 模块进行,JSON 不会上传。此页面没有设置项。

非 camelCase 的键会加上 Jackson 的 @JsonProperty 注解以及 import com.fasterxml.jackson.annotation.JsonProperty。不会生成 kotlinx.serialization 或 Moshi 注解。

null 值和空数组不携带类型信息,因此变为 Any? 和 List<Any?>。

可空字段没有默认值(= null)。如果反序列化时字段可能缺失,请自行添加默认值。

FAQ

为什么整数的类型是 Long 而不是 Int?

生成器对整数一律使用 Long,避免较大的 ID 溢出。超出 64 位整数范围或带小数点的数字会变为 Double。

能转换根节点为数组的 JSON 吗?

可以。根数组会生成一个 typealias,例如 typealias Root = List<Root2>;,以及表示元素类型的 data class Root2。请按代码需要重命名两者。

为什么一个较短的混合数组变成了 Pair<Long, String>?

json_typegen 会把元素类型各不相同的短数组当作元组,因此 [1, "a"] 变为 Pair<Long, String>。如果它实际上是列表,请改为 List<Any>。

规范与参考资料