最推荐.NET Core 3.0+用System.Text.Json,性能好、内存低、原生支持;注意异常类型、命名策略、集合类型限制及类型兼容性问题。

用 System.Text.Json 反序列化最简单也最推荐
.NET Core 3.0+ 默认推荐用 System.Text.Json,性能好、内存占用低、原生支持。它不依赖第三方包,只要项目是 .NET 5+ 或启用了 System.Text.Json 的 .NET Core 3.1+ 就能直接用。
常见错误:传入 null 字符串或格式非法 JSON 时,JsonSerializer.Deserialize<t>()</t> 会直接抛 JsonException,不是 NullReferenceException —— 别错判异常类型。
- 基础写法:
var obj = JsonSerializer.Deserialize<myclass>("{\"Name\":\"Alice\"}");</myclass> - 从文件读取建议用
DeserializeAsync<t></t>配合FileStream,避免一次性加载大 JSON 到内存 - 若 JSON 字段名和 C# 属性名不一致(比如 JSON 是
user_name,C# 是UserName),加[JsonPropertyName("user_name")]特性,别依赖DefaultIgnoreCondition来“猜”映射 - 反序列化数组或集合时,目标类型必须是具体泛型类型(如
List<item></item>),不能是IEnumerable<item></item>—— 否则运行时报错NotSupportedException
用 Newtonsoft.Json(Json.NET)兼容老项目或特殊需求
如果你维护的是 .NET Framework 项目,或需要处理 DateTime 格式混乱、循环引用、JObject 动态解析等场景,Newtonsoft.Json 仍是更灵活的选择。
注意:NuGet 包名是 Newtonsoft.Json,不是 Json.NET;安装后记得加 using Newtonsoft.Json;,否则 JsonConvert.DeserializeObject 找不到。
- 基础写法:
var obj = JsonConvert.DeserializeObject<myclass>("{\"name\":\"Bob\"}");</myclass> - 时间字段容易出问题:默认把
"2023-01-01"当成本地时间反序列化,建议显式配置JsonSerializerSettings.DateFormatHandling = DateFormatHandling.IsoDateFormat - 遇到
Cannot deserialize the current JSON array错误,大概率是传了 JSON 数组但目标类型写了单个对象(比如用了DeserializeObject<user></user>却传了[{"id":1}]) - 动态解析用
JObject.Parse(json)或JArray.Parse(json),比强类型反序列化慢,但适合结构不确定的 API 响应
反序列化失败时怎么快速定位问题
报错信息里带 LineNumber 和 BytePositionInLine 的,基本是 JSON 语法错误(多逗号、少引号、中文引号);没这些信息的,往往是类型不匹配或属性不可写。
- 先用在线工具(如 jsonlint.com)校验 JSON 合法性,排除格式问题
- 检查目标类所有属性是否为
public且有 getter/setter ——private set可以,但readonly字段或只读自动属性(public string Name { get; })无法赋值 - 如果 JSON 里有数字字段,但 C# 属性是
string,System.Text.Json默认不自动转换(会报JsonException: The JSON value could not be converted),得配JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter())类似逻辑,或自定义JsonConverter<string></string> - 调试时临时改成反序列化为
JsonDocument(System.Text.Json)或JToken(Newtonsoft),再逐层查字段是否存在、类型是否对得上
别忽略大小写和命名策略差异
System.Text.Json 默认严格区分大小写,JSON 里的 userName 无法绑定到 C# 的 Username 属性;而 Newtonsoft.Json 默认忽略大小写 —— 这会导致迁移时静默失败。
-
System.Text.Json统一转驼峰:设options.PropertyNamingPolicy = JsonNamingPolicy.CamelCase; - 但注意:这个策略只影响**序列化输出**和**反序列化时的匹配逻辑**,不会改你 C# 属性名本身
- 如果 JSON 是下划线分隔(
first_name),两个库都不自带支持,得手动加[JsonPropertyName]或写自定义JsonNamingPolicy - 混用两个库时(比如一部分用
JsonConvert,一部分用JsonSerializer),命名策略不一致极易引发空字段或绑定失败,建议整个项目统一选型
实际项目里最常踩的坑不是语法写错,而是没意识到「JSON 字段存在但 C# 属性类型不兼容」或者「反序列化器跳过了私有/只读成员」—— 多打一行日志输出原始 JSON 片段,比反复改属性访问修饰符更快定位。


















