跳到主要内容

JSON 转 Kotlin 数据类 — kotlinx.serialization、Gson 或 Moshi

JSON 转 Kotlin data class, 粘 JSON 出 val 属性, camelCase 字段, 可空 T?, 嵌套类, 带 kotlinx.serialization @SerialName、Gson @SerializedName 或 Moshi @Json 注解。

  • 本地处理
  • 分类 开发运维
  • 适合 格式化、校验、压缩或检查和代码相关的文本。
示例:
类型、注解和可空性是怎么推断的

每个 JSON 对象生成一个 Kotlin data class, 属性用 camelCase 的 val; 嵌套对象抽成自己的命名 data class (User.address → UserAddress)。当 Kotlin 属性名跟原始 key (snake_case、kebab-case) 不一致时, @SerialName (kotlinx.serialization)、@SerializedName (Gson) 或 @Json (Moshi) 注解会保留原始 key, 让 (反)序列化往返。整数推断成 Int (超出 32 位范围时用 Long); 带小数的推断成 Double; 一个数字有时是整数有时带小数会放宽到 Double。对象数组会折叠成一个类 —— 某些元素缺的 key (或值为 null) 会变成可空 T?。只出现过 null 的值推断成 Any?。开启"默认值"后, 可空属性会带 = null, List 会带 = emptyList(), 这样不传可选字段也能构造这个类。

这个工具能做什么

把任意 JSON (Retrofit 响应、Ktor 路由 body、Firebase 文档、第三方 REST API) 粘进来, 拿到一组干净的 Kotlin `data class`, 可以直接拖进 `.kt` 文件。属性生成成 `val` (默认不可变, 这是 Kotlin DTO 的惯用写法), JSON 的 key 会转成合法标识符 (`site_admin` 变成 `siteAdmin`、`is-active` 变成 `isActive`、`created_at` 变成 `createdAt`), 类名转成 PascalCase。 按项目已经在用的序列化库选注解: kotlinx.serialization 给每个类加 `@Serializable`, 并且只在 Kotlin 名跟原始 key 不一致时加 `@SerialName("site_admin")`; Gson 用 `@SerializedName`; Moshi 用 `@Json(name = "...")`; 或者选"无"得到不带注解的输出。注解只在 camelCase 的名字真的偏离了原始 key 时才加, 所以像 `name` 这样的字段保持干净、 不用帮忙就能往返。数字不会被一锅端: 能放进 32 位 `Int` 的整数推断成 `Int`, 更大的整数 (毫秒级时间戳、雪花 ID) 推断成 `Long`, 带小数的推断成 `Double`, 一个字段在一个样本里是整数、另一个里带小数会放宽到 `Double`。 可空性严格按 Kotlin 的类型系统来: 在对象数组某些元素里缺失、或出现过 JSON `null` 的 key 变成 `T?`, 只出现过 null 的值推断成 `Any?`。对象数组 会折叠成一个共享 data class, 所以 `[{"a":1},{"a":1,"b":2}]` 出来是一个 同时带两个字段 (`b` 可空) 的类型, 而不是两个几乎重复的类。嵌套对象会抽成 自己的命名类 (`User.address` 变成 `UserAddress`), 可选的"默认值"开关会 给可空属性加 `= null`、给 List 加 `= emptyList()`, 这样不传可选字段也能 构造这个类。全部在浏览器里跑, JSON 不碰服务器。

工具细节

输入
文本 + 数值 + 结构化内容
页面会根据工具类型展示文本框、数值控件、文件选择或结构化输入。
输出
即时结果 + 复制 + 下载
结果区优先给出可操作结果,支持项会显示复制、下载或可视化预览。
隐私
浏览器本地处理
主工具逻辑未发现外部 API 调用,输入通常留在当前标签页内处理。
保存 / 分享
可分享链接状态
关键设置会进入 URL,复制链接后别人能复现同一组参数。
性能预算
首屏 JS ≤ 25 KB
没有声明 WASM 依赖,适合快速打开和移动端使用。
适用场景
开发运维 · 程序员
分类和职业标签用于推荐相关工具、组织内链,并帮助用户快速判断是否适合当前任务。

怎么用

  1. 1. 输入

    把内容粘贴或拖入工具面板。

  2. 2. 处理

    点击按钮,在浏览器内本地处理,文件不上传。

  3. 3. 复制 / 下载

    一键复制结果或下载到本地。

JSON 转 Kotlin 数据类 适合怎么用

适合穿插在写代码、查问题、做 Review、上线前的小任务里。

适合开发场景

  • 格式化、校验、压缩或检查和代码相关的文本。
  • 把片段整理好再放进文档、工单、提交或交接材料。
  • 不切换工具,快速检查一个小 payload。

开发检查项

  • 压缩、混淆这类不可逆处理,先对副本操作。
  • 除非确认工具本地处理,不要粘贴密钥和敏感片段。
  • 转换后的代码上线前,仍要跑自己的测试或 lint。

下一步可以接着做

这些入口会把当前任务接到更完整的工具链里。

  1. 1 JSON 转 Java 类 JSON 转 Java POJO、record 或 Lombok @Data, 粘 JSON 出 camelCase 字段, 带 getter/setter, Jackson @JsonProperty 或 Gson @SerializedName, 嵌套类, 基本类型与装箱推断。 打开
  2. 2 JSON 转 C# 类 JSON 转 C# class 或 record, 粘 JSON 出 PascalCase 属性, 带 System.Text.Json 或 Newtonsoft 特性, 嵌套类, 可空 T?, init 访问器, ISO 日期识别成 DateTime。 打开
  3. 3 JSON 转 Go 结构体 JSON 转 Go struct, 粘 JSON 出带 json tag 的结构体, 字段自动导出, 嵌套对象生成子 struct, 可空字段用指针, 支持 int64 与 omitempty。 打开

真实使用场景

  • 接 Retrofit 响应时不再手写 model

    你在 Android app 里用 Retrofit + Moshi 调一个第三方 REST API, 响应 有 25 多个字段, 是 snake_case。curl 一次, 把 JSON 粘进来, 根名设为 `OrderResponse`, 选 Moshi。每个 `created_at` 这样的 key 都会加 `@Json(name = ...)`, 让转换器绑得上, 嵌套对象抽成自己的类, 可选字段 变成 `T?`。把输出放进 `OrderResponse.kt`, 声明 `@GET("orders") suspend fun orders(): OrderResponse`, 你就拿到一个 完全类型化的结果, 而不是一个要你一个字段一个字段强转的 `Map<String, Any?>`。

  • 给 Ktor 服务写 kotlinx.serialization 模型

    你在写一个 Ktor 后端, 想给新 endpoint 弄一个请求和响应 model。粘进 请求 body 样例, 根名 `CreateOrderRequest`, 保持 kotlinx.serialization。 你拿到一个 `@Serializable data class`, 改名的字段上带 `@SerialName`, 以及它需要的精确 import。打开默认值, 这样缺失的 key 能干净地解码而 不是抛异常, 当 payload 里哪天冒出一个新的可选字段时, 这个 model 是 向前兼容的。

  • 看清 webhook 里到底哪些字段是可选的

    某第三方的 webhook 有时带 `cancelled_at`, 有时不带。把几次 payload 记下来, 作为 JSON 数组粘进来, 数组折叠的检测会标出 `cancelled_at` 在某些元素里缺失, 于是它变成 `String?`, 而不是一个反序列化时会崩 的非空字段。在 handler 里做个 `?.let { }`, 现在就能干净地区分 "已取消"和"仍有效", 不用再猜某个默认值是不是代表字段没发。

  • 把 Java DTO 迁成地道的 Kotlin data class

    你在把一个 Android 模块从 Java 移到 Kotlin, 一个 Gson 绑定的 POJO 要变成 data class。抓一个有代表性的 JSON 响应粘进来, 选 Gson, 你会 拿到带 `@SerializedName` 注解的 `val` 属性, 都在一个 `data class` 里, 没有 getter、没有 `equals`/`hashCode` 样板, 还白送 `copy()`。 新类的行数只有 Java 原版的一小部分, 读起来跟它建模的 JSON 一模一样。

  • 把 Map<String, Any?> 换成真正的类型

    老 Kotlin 代码是 `val data: Map<String, Any?> = parse(body)`, 然后用 `data["id"] as String` 这样的强转一层层挖, 丢掉了所有编译期检查, 还招来运行时的 `ClassCastException`。抓一个有代表性的响应粘进来, 生成 data class, 替换掉这个 map。现在 `Int`、`Long`、`Double` 在每个 字段上都推断好了, 可空性是显式的, 改个 key 名编译期就会报错, 而不是 上线后才出问题。

常见踩坑

  • 粘一个对象进来然后期待某些字段可空。单个对象没有“key 缺失”信号, 所以除非值本身就是 null, 否则每个字段都是非空的。可空推断只在“多个对象组成的数组”里生效 (有的元素带某个 key、有的不带)。想从一个样本探索可选性, 把它包成 `[{...}]`。

  • 把金额或需要精确小数的字段留成 `Double`。工具对任何带小数的数字都推断成 `Double`, 但 `Double` 是二进制浮点, 会把 0.1 或货币总额这类值表示错。金额请在生成后改成 `BigDecimal`。JSON 不带“这个数字需要精确十进制精度”的任何信号。

  • 忘了 kotlinx.serialization 的 Gradle 插件和运行时。`@Serializable` 注解既要 `org.jetbrains.kotlin.plugin.serialization` Gradle 插件, 也要 `kotlinx-serialization-json` 依赖; 没有插件代码编译不过。如果你只想要朴素的类, 改选“无”注解风格。

  • 删掉 @SerialName / @Json / @SerializedName 注解还指望绑定照常工作。这个注解正是把 `site_admin` (线上) 映射到 `siteAdmin` (属性) 的东西。删了它, 序列化库会去找一个根本不存在的 `siteAdmin` key, 字段就留成 null 或者解码失败。要么留着注解, 要么配一个全局命名策略。

隐私说明

你粘进来的 JSON 不会离开这个浏览器标签页。解析和类型推断走浏览器内建的 `JSON.parse`, 没有任何网络请求, 也不对文本框内容做 analytics。分享链接会 把你的输入和根类名编码进 URL 以便复现结果, 也就是说由你决定何时分享。 如果 payload 敏感 (内部 ID、客户数据、生产响应), 直接复制生成的 Kotlin 代码, 不要分享链接。只有选项 (注解风格、默认值) 会存进 localStorage, 让 你偏好的风格在多次访问之间保留。

常见问题

类似工具组合

做你这行的人, 还会一起用这些。

Made by Toolora · 100% client-side · Updated 2026-06-13