JSON 转 C# 类 — 从 JSON 生成 C# 模型类
从 JSON 生成 C# 模型类。PascalCase 属性、可空类型、JsonPropertyName 特性。完全在浏览器中运行 —— 无需上传、无任何限制。
JSON to C# Class
Convert JSON to C# model class with System.Text.Json attributes. Works entirely in your browser.
C# 已经是 .NET 运行时上企业级软件长达二十年的语言,而 JSON 作为 Web API 的通用语也已存在差不多的时间。两者之间的摩擦,始终是阻抗失配:C# 是静态类型,JSON 是动态类型,连接两者的桥梁是反序列化器 —— 它必须提前知道数据的形状。为每个 API 响应手写 C# 类既重复又容易出错,而且一旦 API 变动,这是最容易脱节的部分。从一份 JSON 响应样本生成类是标准的解法,生成的类充当事实之源,直到下一次 API 变更迫使其重新生成。
C# 类生成中「不那么显然」的地方,是命名约定。JSON 键通常是 snake_case(user_id、created_at),而 C# 属性是 PascalCase(UserId、CreatedAt)。生成器会自动处理大小写转换,输出符合 C# 约定的属性,并可选地添加 [JsonPropertyName] 特性,保留反序列化所需的原始 JSON 键。默认省略特性,依赖反序列化器的大小写不敏感匹配 —— 适合同时掌控前后端的新代码。输出特性的模式则适合遗留代码库,或完全使用 snake_case 键的 API。
最后的交接建议:如果目的地是 ASP.NET Web API 控制器,把生成的类贴进 Models 文件夹,让控制器直接以 JSON 形式返回 —— 往返由反序列化器处理。如果目的地是桌面或移动应用,添加 [JsonPropertyName] 特性以匹配源 API 的精确大小写。如果目的地是 Blazor 或 Razor Pages 应用,生成的类可以直接作为页面 @model 指令的模型。生成的类只是起点 —— 随代码库成熟,逐步补上校验特性、XML 文档注释和业务逻辑方法。
使用方法
粘贴你的 JSON
把一个 JSON 对象或一段 JSON 对象数组拖入输入框。生成器会遍历整个结构,为根类型输出一个 C# 类,并为每个对象形状输出一个嵌套类。
选择输出选项
在 class(带公共属性的可变 POCO)和 record(不可变的 C# 9+ record,仅 init 访问器)之间选择。可切换「可空引用类型」开关,匹配启用了 `<Nullable>enable</Nullable>` 的项目。
复制或下载类
把生成的 C# 代码复制到剪贴板,或下载为 .cs 文件。输出可直接粘贴进 System.Text.Json 和 Newtonsoft.Json 的反序列化器 —— 基础场景下无需额外特性。
常见问题
输出能直接配合 System.Text.Json 使用吗?
可以 —— 默认情况下,生成器输出的类使用 PascalCase 属性,与 System.Text.Json 的默认反序列化匹配。开启「JsonPropertyName 特性」开关后,会为使用 snake_case JSON 键 + PascalCase C# 属性的项目输出 `[JsonPropertyName("original_key")]`。
嵌套对象如何处理?
嵌套对象会变成嵌套类,类名由 JSON 键派生为 PascalCase。JSON 中的 `user.profile.name` 路径会产出 `User` 类,其中带一个 `Profile` 类型的 `Profile` 属性,再加一个 `Profile` 类,其中带 `Name` 字符串属性。任意深度的深层嵌套都按同一方式处理。
JSON 数组呢?
JSON 数组会变成 C# 的 `List<T>` 属性,T 为推断出的元素类型。对象数组变成 `List<NestedClass>`,字符串数组变成 `List<string>`,混合类型数组变成 `List<object>`。生成器会在文件顶部输出 `using System.Collections.Generic;`。
生成的是 record 还是 class?
默认输出带公共属性和默认无参构造函数的 class。开启「record」开关后,会输出 C# 9+ 的位置 record 或 init-only record,它们是不可变的,支持 `with` 表达式。record 要求 .NET 5+ 或 .NET Standard 2.1+。
如何处理 null 值?
默认情况下,当项目启用了可空引用类型时,所有引用类型属性会输出为可空(`string?`、`int?`)。未启用可空引用类型的项目,所有属性都是非可空的 —— 在构造函数里赋默认值,或在反序列化器里做默认值处理。
限制说明
- 推断类型未经校验生成器依据样本数据推断类型。在样本里以字符串形式出现的字段,实际可能是枚举、日期或受限整数。生成的 C# 使用的是推断类型 —— 仔细审一遍输出,手动补上枚举、`DateTime` 转换或范围特性。
- 不输出 System.Text.Json 源生成器代码输出的是可与基于反射的反序列化器配合的 POCO 类。较新的源生成器(System.Text.Json 的 `JsonSerializerContext`)需要不同的代码结构,本工具不输出。若需要兼容源生成器,请后处理输出,再补上 context 类。
- 不带 XML 文档生成的类不包含 XML 文档注释。需要手动补 `///` 摘要,或者用文档生成器后处理输出,让类对 IntelliSense 友好。
平台说明
- macOS
- Visual Studio for Mac、Rider,以及装了 C# 扩展的 VS Code 都能正常处理生成的类。对于不值得专门打开 IDE 的一次性生成,浏览器工具是更合适的选择。
- Windows
- Visual Studio 和 Rider 都能正常处理生成的类。对于从某个 API 响应样本一次性生成类型,或把从聊天/邮件粘贴的内容转成 C# 类这类场景,浏览器工具是更合适的选择。
- Linux
- 命令行场景下,标准等价工具是 `quicktype --lang csharp`。当不值得专门安装 Node 和 quicktype 时,浏览器工具是一次性生成的正确选择。
- Web
- 完全在客户端运行。页面加载后即可离线使用。在没有命令行工具或 .NET SDK 的受限环境下尤其好用。