跨平台开发:JSON To Kotlin数据类 — Numio
根据 JSON 示例生成 Kotlin data class。整数变为 Long,小数变为 Double,嵌套对象各自生成类,数组中部分元素缺少的键变为 Boolean? 这样的可空类型。
为使用 Jackson 解析 JSON 的 Android 应用建模 REST 响应。
适用场景
- 为使用 Jackson 解析 JSON 的 Android 应用建模 REST 响应。
- 根据示例载荷为 Ktor 或 Spring Boot 服务创建 DTO。
使用方法
- 将有代表性的 JSON 对象或数组粘贴到 JSON 编辑器中;请包含能体现可选键的数组元素。
- 查看 Kotlin 面板:顶层类名为 Root,嵌套类按键名命名(projects 变为 Project)。
- 复制这些类,重命名 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>。