JSON 转 C# Class / Record
从 JSON 推断 C# Record 或 Class,支持嵌套模型、可空类型和序列化属性
根据样本推断,不是完整 API 契约。字段缺失与显式 null 分别推断,输出类型可能合并两者;数组内的 null 单独保留可空性。重复键和会改变数值的输入会报错。
上限:1 MiB、64 层、20,000 个值、200 个模型、2,000 个模型字段。精确大整数或金额请用字符串。
目标:C# 10+。System.Text.Json 随 .NET 提供;Newtonsoft.Json 需项目依赖。record 参数不生成默认值,避免可选参数排在必填参数前。
生成后请在目标项目编译,并用代表性响应验证反序列化。
工具说明
JSON 转 C# Class / Record 生成 C# 10+ 源码,支持文件作用域命名空间、嵌套模型及 System.Text.Json 或 Newtonsoft.Json 映射。序列化属性保留原字段名,生成成员名称即使在不区分大小写的构造匹配下也保持唯一。Newtonsoft Record 参数同时获得 property 与 parameter 映射,防止相似规范化名称串值。Record 不生成参数默认值,避免可选参数位于必填参数前;可变 Class 使用 get/set 属性。数组中的 null 生成独立可空元素类型,例如 List<long?>。推断分别观察缺失与显式 null,但生成的可空模型不保存字段出现历史。未知值使用 object;关闭可空引用注解也不能阻止运行时 null。仅在原数字词法不会改变值、整数处于安全范围时,才推断 long 或 double;精确金额和大标识符应使用字符串。所有工作在本地完成,上限为 1 MiB、64 层、20,000 个值、200 个模型与 2,000 个字段。在目标 .NET 项目编译并验证代表性响应后,再补充 decimal、DateTime、枚举、required 成员或自定义转换契约。
场景配方
验证 Newtonsoft Record 中的相似 JSON 键
目标:构造映射经过核对,规范化名称之间不发生串值。
- 粘贴 {"a-b":1,"a_b":2,"aB2":3},选择 Record 与 Newtonsoft.Json。
- 检查唯一成员名以及 property、parameter 两种 JsonProperty 属性。
- 使用 Newtonsoft.Json 读入后重新编码,确认三个原始键分别保留各自数值。
结果:构造映射经过核对,规范化名称之间不发生串值。
失败门诊(高频踩坑)
两个 JSON 键填入了错误 Record 参数
原因:规范化后的名称可能在序列化器构造匹配规则下冲突。
修复:保留唯一名称与 Newtonsoft 双目标属性,再用不同样本值逐一核对原键。
大 ID 进入 long 前就改变了
原因:即使 C# long 能保存原整数,浏览器数字解析也可能先取整。
修复:生成时将 ID 保持为带引号字符串,在目标项目采用明确并经过验证的转换。
生产可用片段
System.Text.Json Record 中的可空列表元素
csharp
// Input: {"values":[1,null,2]}
public record ApiResponse(
[property: JsonPropertyName("values")] List<long?> Values
);
// Requires System.Collections.Generic and System.Text.Json.Serialization.常见问题
为什么 Record 参数没有 null 默认值?
C# 不允许可选参数位于必填参数前。生成器保留无默认值的位置参数,用类型表达样本可空性。
为什么 Newtonsoft 同时生成 property 与 parameter 属性?
构造参数匹配可能混淆规范化后相似的名称。两个目标都标记原 JSON 名称,使读写使用同一映射。
可空引用模式会改变 JSON 运行时校验吗?
不会。它改变编译器注解;运行时仍可能出现 null,必填字段与转换器需要另行配置。
可以自动推断 decimal 或 DateTime 吗?
不能。JSON 样本不能说明金额、时区或领域约束。精确源值使用字符串,领域转换由应用选定并验证。
继续浏览