JSON 转 C# class 或 record, 粘 JSON 出 PascalCase 属性, 带 System.Text.Json 或 Newtonsoft 特性, 嵌套类, 可空 T?, init 访问器, ISO 日期识别成 DateTime。
- 本地处理
- 分类 开发运维
- 适合 格式化、校验、压缩或检查和代码相关的文本。
类型、特性和可空性是怎么推断的
每个 JSON 对象生成一个命名 class 或 record, 属性用 PascalCase。当 C# 名跟原始 key (snake_case、kebab-case、camelCase) 不一致时, [JsonPropertyName] (System.Text.Json) 或 [JsonProperty] (Newtonsoft) 特性会保留原始 key, 让 (反)序列化往返 —— System.Text.Json 默认大小写敏感, 正是这个特性才让 snake_case 的 JSON 能绑定上。整数推断成 int (超出 Int32 范围时用 long); 带小数的推断成 double; 一个数字有时是整数有时带小数, 字段会放宽到 double。开启"识别日期"后, ISO-8601 字符串推断成 DateTime。对象数组会折叠成一个 class —— 某些元素缺的 key (或值为 null) 会变成可空 T?。只出现过 null 的值推断成 object。
这个工具能做什么
把任意 JSON (GitHub API 响应、Stripe webhook、appsettings.json、 第三方 REST body) 粘进来, 拿到一组干净的 C# `class` (或 `record`) 声明, 属性是 PascalCase, 可以直接拖进 `.cs` 文件。JSON 的 key 会被 转成合法的 C# 标识符 (`site_admin` → `SiteAdmin`、`is-active` → `IsActive`、`userId` → `UserId`); 只要 C# 名跟原始 key 不一致, 工具 就给属性加上 `[JsonPropertyName("site_admin")]` (System.Text.Json) 或 `[JsonProperty("site_admin")]` (Newtonsoft) 特性, 让 (反)序列化能往返: System.Text.Json 默认大小写敏感, 正是这个特性才让 snake_case 的 JSON 绑得上属性。数字不会被一锅端: 能放进 Int32 的整数推断成 `int`, 更大的整数推断成 `long`, 带小数的推断成 `double`, 一个字段有时是整数 有时带小数会放宽到 `double`。开启"识别日期"后, ISO-8601 字符串推断成 `DateTime`。对象数组会折叠成一个共享 class, 所以 `[{"a":1},{"a":1,"b":2}]` 出来是一个同时带两个字段的类型, 而不是两个 几乎重复的类: 某些元素里缺的 key (或值为 null) 会变成可空 `T?`。 `class` 和 `record`、`{ get; set; }` 和 `{ get; init; }`、可空开关都 能切, 根类名可改, 输入和根名能拼成链接分享, 输出可一键复制或下载 `.cs` 文件。只有输出真正用到的 `using` 才会被列出来。全部在浏览器里 跑: JSON 不碰服务器。
工具细节
- 输入
- 文本 + 数值 + 结构化内容
- 页面会根据工具类型展示文本框、数值控件、文件选择或结构化输入。
- 输出
- 即时结果 + 复制 + 下载
- 结果区优先给出可操作结果,支持项会显示复制、下载或可视化预览。
- 隐私
- 浏览器本地处理
- 主工具逻辑未发现外部 API 调用,输入通常留在当前标签页内处理。
- 保存 / 分享
- 可分享链接状态
- 关键设置会进入 URL,复制链接后别人能复现同一组参数。
- 性能预算
- 首屏 JS ≤ 25 KB
- 没有声明 WASM 依赖,适合快速打开和移动端使用。
- 适用场景
- 开发运维 · 程序员
- 分类和职业标签用于推荐相关工具、组织内链,并帮助用户快速判断是否适合当前任务。
怎么用
-
1. 输入
把内容粘贴或拖入工具面板。
-
2. 处理
点击按钮,在浏览器内本地处理,文件不上传。
-
3. 复制 / 下载
一键复制结果或下载到本地。
JSON 转 C# 类 适合怎么用
适合穿插在写代码、查问题、做 Review、上线前的小任务里。
适合开发场景
- 格式化、校验、压缩或检查和代码相关的文本。
- 把片段整理好再放进文档、工单、提交或交接材料。
- 不切换工具,快速检查一个小 payload。
开发检查项
- 压缩、混淆这类不可逆处理,先对副本操作。
- 除非确认工具本地处理,不要粘贴密钥和敏感片段。
- 转换后的代码上线前,仍要跑自己的测试或 lint。
下一步可以接着做
这些入口会把当前任务接到更完整的工具链里。
- 1 JSON 转 TypeScript Interface JSON 转 TypeScript interface, 粘 JSON 出干净 interface, 数组元素合并为 union, 可选字段自动识别, 根类型名可命名。 打开
- 2 JSON 转 Go 结构体 JSON 转 Go struct, 粘 JSON 出带 json tag 的结构体, 字段自动导出, 嵌套对象生成子 struct, 可空字段用指针, 支持 int64 与 omitempty。 打开
- 3 JSON 转 Python Dataclass JSON 转 Python, 粘 JSON 出 @dataclass 或 Pydantic v2 模型, 带类型注解, Optional 推断, 嵌套子类, 字段转 snake_case 并保留别名。 打开
真实使用场景
接第三方 API 时不再手写类
你在接 GitHub API, user 对象有 30 多个字段。curl 一次拿到响应, 粘进来, 根名设为 `GitHubUser`, 保持 System.Text.Json。嵌套对象 自动抽成自己的类 (`GitHubUserPlan`), `html_url` 变成 `HtmlUrl` 并带 `[JsonPropertyName("html_url")]` 特性, `site_admin` 变成 `SiteAdmin` 这样才真的绑得上。复制输出到 `Models/GitHubUser.cs`, `JsonSerializer.Deserialize<GitHubUser>(body)` 就填进一个完全 类型化的对象, 而不是一个要你手动一层层挖的 `JsonElement`。
给新 ASP.NET endpoint 生成请求 / 响应 DTO
同事发来他在做的 `/orders` POST 的一个 JSON body 样例。粘进来, 根名 `CreateOrderRequest`, 类型切成 `record`、访问器切成 `init`, 让 DTO 不可变。响应样例也粘进来命名 `CreateOrderResponse`。 两个 record, 特性齐全, 在你们任何一方写 controller action 之前 就提交进 `Dtos.cs`。
给 webhook payload 决定可空还是非可空
某第三方的 webhook 有时带 `cancelled_at`, 有时不带。把前几次 payload 记下来, 作为 JSON 数组粘进来, 可选字段识别会标出 `cancelled_at`。开着可空和"识别日期", 它变成 `DateTime?`, 这样 在 handler 里 `if (e.CancelledAt is not null)` 就能干净地区分 "已取消"和"仍有效", 不用再猜 default(DateTime) 是不是"没发"。
把 JObject / dynamic 数据块换成真正的类型
老代码是 `dynamic data = JObject.Parse(body)`, 然后用 `data.user.id` 一层层挖, 丢掉了所有编译期检查。抓一个有代表性 的响应粘进来, 生成类, 替换掉 dynamic。现在 `int`、`long`、 `double` 在属性层面就推断好了, 改个字段名编译器会当场报错, 而不是上线后在运行时抛 `RuntimeBinderException`。
从 appsettings.json 生成强类型配置
你的服务读一段 `config.json` / `appsettings.json`。粘进来, 根名 `ServiceOptions`, 拿到 `ServiceOptions`、 `ServiceOptionsServer`、`ServiceOptionsServerTls` 嵌套类, 端口是 `int`, 开关是 `bool`。放进 `ServiceOptions.cs`, 用 `builder.Services.Configure<ServiceOptions>(...)` 绑定, 配置在 编译期就被类型检查, 而不是运行时因为一个拼错的 key 才抛异常。
常见踩坑
粘一个对象进来然后期待某些属性是可空的。单个对象没有"key 缺失"信号, 所以除非值本身就是 null, 否则所有字段都是必需。可空 / 可选推断只在"多个对象组成的数组"里生效 (有的元素带某个 key、有的不带)。想从一个样本探索可选性, 把它包成 `[{...}]`。
指望 System.Text.Json 不带特性就能绑 snake_case。跟 Newtonsoft (默认大小写不敏感) 不同, System.Text.Json 默认按大小写敏感匹配属性名。这正是工具输出 `[JsonPropertyName("site_admin")]` 的原因, 你一删掉它, `SiteAdmin` 就会悄悄回退成默认值。把特性留着, 或者在序列化器选项里设全局命名策略。
以为数字型 ID 该用 long。如果你的 ID 是 JSON 字符串 (Stripe 的 `cus_123`、很多 UUID API), 它们会被推断成 `string` 而不是 long, 这才是对的。`long` 只适用于超出 Int32 范围的整数型 JSON 值。别手动把字符串 ID 改成 long, 反序列化会因为格式异常崩。
把一个只出现过 null 的字段当成有类型的属性。`{"meta": null}` 出来是 `public object Meta`, 因为 null 不带类型信息。如果你知道真实形状, 喂一个非 null 样本 (`{"meta": {"k": 1}}`), 工具才能推出像样的类。
粘 JSON5 / 带注释的 JSON / 末尾逗号。工具用严格的 `JSON.parse`, 注释、不带引号的 key、末尾逗号都会报错并给出行列号。先剥掉, 或者先过一道 JSON 格式化工具。
隐私说明
你粘进来的 JSON 不会离开这个浏览器标签页。解析和类型推断走浏览器 内建的 `JSON.parse`, 没有任何网络请求, 也不对文本框内容做 analytics。 分享链接会把你的输入和根类名编码进 URL 以便复现结果, 也就是说由你 决定何时分享。如果 payload 敏感 (内部 ID、客户数据、生产响应), 直接 复制生成的 C# 代码, 不要分享链接。只有选项 (特性风格、class/record、 init/set、可空、识别日期) 会存进 localStorage, 让你偏好的风格在多次 访问之间保留。
常见问题
类似工具组合
做你这行的人, 还会一起用这些。