JSON 转 C#:转换差异、边界与常见坑

在线 JSON 转 C#:按 PascalCase 生成类属性并附加 JsonPropertyName 映射,可直接用于 System.Text.Json 或 Newtonsoft,省去手写实体类的时间。

把 JSON 样本转成 C# 类,属性名走 PascalCase 并由特性映射原始键名。生成结果需要人工审一遍:数字默认 double 会毁掉大整数,空数组推断出的 object[] 只是占位,可空性也要按接口实际契约调整。

两种格式的差异对照

维度JSONC# 类型定义
类型系统弱类型,运行时才知道强类型,编译期校验
命名习惯camelCase / snake_case 混用PascalCase 属性,常配映射特性
null 处理值为 null 即可值类型需 Nullable<T> 或 ? 后缀
数组同类元素可混合强类型集合(List<T> / T[])
数字精度大整数可能被浮点化long / decimal 可精确保存
日期字符串或时间戳DateTime / DateTimeOffset 明确语义
可空性字段缺失与 null 不区分可空引用类型语法可显式标注
运行时开销解析成本低反序列化有对象分配成本

边界条件

  • JSON 里的数字统一按 double 推断时,超出 2^53 的整数会失真,应手工把该属性改成 long 或 decimal。
  • 同一字段在不同对象里类型不一致(有时数字有时字符串)会导致推断失败,需要生成 object 或做联合处理。
  • 键名含连字符或点号("user-name")无法直接作为标识符,必须依靠映射特性桥接。
  • 空数组无法推断元素类型,会生成 object[] 或 List<object>,需要手工替换为具体类型。

常见坑

  • 删掉工具生成的 JsonProperty 映射特性,导致反序列化后字段全是默认值且不报错。
  • 大整数被推断成 double,订单号末位变 0,写库才发现。
  • 空数组推断出 object[],编译能过但后续取值处处需要强转。
  • 同一字段在不同样本里类型不同,生成的类型只符合其中一种,另一种运行时抛异常。

相关工具

常见问题

怎么把 C# 再转回 JSON?

使用同工具的交换方向功能,或本站对应的「C# 转 JSON」页面,两者都本地运行、数据不上传,可完成往返转换与校验。

JSON 和 C# 哪个更适合人类阅读?

这取决于场景:C# 通常更偏向程序解析与接口传输式的可读形态,而 JSON 更利于程序解析与接口传输式的程序消费;需要人工编辑时优先选可读性更高的那一侧。

生成的是 class 还是 record?

默认多是 public class + 属性(get/set),兼容性最好。C# 9+ 的 record 更适合不可变数据(值相等、with 表达式),但不是所有序列化器与老框架都同等支持。需要 record 时在生成结果上手动改,或选支持该选项的工具。

字段名大小写和 JSON 不一致怎么办?

C# 属性惯例是 PascalCase,而 JSON 常见 camelCase 或 snake_case。工具通常会同时生成属性与映射特性([JsonPropertyName("user_name")]),保留原始键名。不要手工删掉这些特性——删了序列化就找不到字段,表现为"解析成功但所有字段都是默认值"。