直接用 jsonserializer.deserialize(),.net core 3.0+ 自带,性能高无依赖;类型不匹配报 jsonexception,需检查字段值与属性类型是否一致、json 结构是否匹配类定义、数组反序列化目标类型是否为集合、字段名大小写或下划线映射是否配置正确。

直接用 JsonSerializer.Deserialize<t>()</t>,别绕弯——.NET Core 3.0+ 和 .NET 5+ 自带,性能高、无依赖、够用。
反序列化时类型不匹配就报 JsonException,怎么快速定位?
这不是 JSON 格式错误,而是运行时类型对不上。典型现象:字段值是字符串 "123",但 C# 属性是 int;或 JSON 里是空对象 {},而目标类没无参构造函数。
- 看异常消息里的具体路径,比如
$.data.items[0].id—— 它指明了出问题的 JSON 位置 - 用
JsonDocument.Parse(json)先加载再检查结构,确认字段名、类型、嵌套层级是否和 C# 类一致 - 临时把目标属性改成
JsonElement或object(仅调试),打印出来看真实值 - 别信“JSON 看起来没问题”,用在线校验器(如 jsonlint.com)过一遍,排除不可见字符或 BOM
JsonSerializer.Deserialize<list>>()</list> 报错说不能反序列化数组?
错误信息通常是 Cannot deserialize the current JSON array into type 'T',说明你传的是 JSON 数组(以 [ 开头),但目标类型写成了单个对象 T,不是集合。
- ✅ 正确写法:
JsonSerializer.Deserialize<list>>(json)</list>或JsonSerializer.Deserialize<user>(json)</user> - ❌ 错误写法:
JsonSerializer.Deserialize<user>(json)</user>(当json是[{...},{...}]时) - 接口类型不支持,
IEnumerable<user></user>、IList<user></user>都会失败,必须用具体实现类 - 如果 JSON 可能为
null或空字符串,先判断:if (string.IsNullOrWhiteSpace(json)) return new List<user>();</user>
JSON 字段名是 user_name,C# 属性是 UserName,怎么映射?
默认大小写敏感、PascalCase 映射,所以不配就会丢值。两种主流解法:
- 加选项:
new JsonSerializerOptions { PropertyNameCaseInsensitive = true }—— 快速兜底,适合字段名风格混乱的老接口 - 精准控制:在属性上加
[JsonPropertyName("user_name")]—— 推荐用于新项目,语义明确、IDE 可跳转、重构安全 - 别混用:Newtonsoft 的
[JsonProperty]对System.Text.Json无效,引用错命名空间会导致静默失效 - 注意:驼峰转 PascalCase 不是自动的,
PropertyNameCaseInsensitive = true只解决大小写,不解决下划线分隔
最容易被忽略的是 null 值处理和缺失字段行为——System.Text.Json 默认保留 null 字段、静默忽略 JSON 中多出来的字段,这在对接松散 API 时可能掩盖数据不一致问题。真要严格校验,得靠 JsonDocument 手动遍历比对,或者加自定义 JsonConverter 拦截。










