在线JSON转C#类工具

把 JSON 生成 C# 类、属性转 PascalCase、可选 System.Text.Json 或 Newtonsoft 特性

粘 JSON,得到一组 C# 类:属性名转 PascalCase,凡是改名过的 key 都自动带上序列化特性,免得反序列化出来全是 null。

C# 不在乎声明顺序,所以父类写在前面。null 推断成 object、空数组是 List<object>——这两个工具本来就不可能知道。项目开了 <Nullable>enable</Nullable> 就勾上可空引用类型,否则 string 属性会有警告。

关于JSON转C#类

粘 JSON,生成一组 C# 类:属性名转 PascalCase,凡是改过名的 key 都自动带上序列化特性。

C# 比 Java 省事一点,但特性不能省。 class 转成 Class 之后就不再是关键字了(C# 关键字全小写),所以不用像 Java 那样退成 class_。可是 user_name 转成 UserName 之后,序列化器只认 UserName——不加特性,反序列化出来就是 null,而且不会报错,这是这类工具最常见的坑。

两个序列化器不通用,选错能编译但字段全空。 .NET Core 3.0 之后默认是 System.Text.Json,特性叫 [JsonPropertyName];老项目还在用 Newtonsoft,特性是 [JsonProperty]。两边的特性互不认识,所以这里做成下拉选择,而不是猜一个。

可空引用类型要按项目来。 如果项目开了 <Nullable>enable</Nullable>,属性没初始化会有一堆 CS8618 警告——勾上「可空引用类型」,引用类型就会加 ?。没开这个特性的老项目则不要勾,否则 string? 反而编不过。

三处推断不出来的地方:null 是 object(不知道本来是什么)、空数组是 List<object>、数组里只有部分记录带的字段会照样生成(缺的那条运行时是 null)。

常见问题

生成的代码能直接编译吗?

能。System.Text.Json 从 .NET Core 3.0 起内置,不需要额外装包;Newtonsoft 模式需要 Newtonsoft.Json 包。

为什么属性上要加 JsonPropertyName?

属性名和 JSON key 不一致时必须加。C# 属性按惯例是 PascalCase,而 JSON 常用 snake_case,不加特性反序列化得到的是 null,而且不报错。

System.Text.Json 和 Newtonsoft 选哪个?

新项目用 System.Text.Json(内置、性能好);还在用 .NET Framework 或已有 Newtonsoft 依赖的项目选 Newtonsoft。

为什么会出现 CS8618 警告?

项目开了可空引用类型,而属性没有初始化。勾上「可空引用类型」让引用类型变成 string?,或者给属性一个默认值。

null 为什么生成 object?

无从推断它本来该是什么类型。拿到真实数据后手动改成具体类型即可。

会上传我的 JSON 吗?

不会。生成全在浏览器里完成。

同类工具

转换工具 查看全部 ›