System.Text.Json 是 .NET Core 3.0+ 反序列化 JSON 的首选,需显式指定 Encoding.UTF8、严格匹配结构与类型、用 JsonPropertyName 或 JsonNamingPolicy 处理命名差异,并避免大文件全量读取。

用 System.Text.Json 读取并反序列化 JSON 文件最稳妥
现代 C#(.NET Core 3.0+ / .NET 5+)首选 System.Text.Json,它原生、高效、无额外依赖。直接读文件 + 反序列化一步到位,但要注意编码和异常处理。
-
File.ReadAllText(path)默认用 UTF-8,但若 JSON 文件含 BOM 或是 UTF-16 编码,可能抛JsonException;建议显式指定Encoding.UTF8 - 反序列化失败时不会静默吞错——
JsonSerializer.Deserialize<T>(json)遇到字段名不匹配、类型不兼容会直接抛JsonException,不是返回null - 如果 JSON 根节点是数组,而目标类型是 class,会报 “The input does not contain any JSON tokens” 错误;确认 JSON 结构与泛型参数
T严格一致
示例:
string json = File.ReadAllText("config.json", Encoding.UTF8);
var config = JsonSerializer.Deserialize<AppConfig>(json);遇到属性名不匹配(如 JSON 是 snake_case,C# 是 PascalCase)怎么办
默认情况下,System.Text.Json 要求 JSON 属性名与 C# 属性名完全一致(大小写敏感)。实际中常见命名风格差异,需靠序列化选项修复。
- 全局统一处理:用
JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase—— 适用于 JSON 是 camelCase、C# 是 PascalCase - 精准控制单个字段:在 C# 属性上加
[JsonPropertyName("user_id")]特性(需引用System.Text.Json) - 若 JSON 是
snake_case(如first_name),没有内置策略,必须手动配[JsonPropertyName]或自定义JsonNamingPolicy
注意:JsonPropertyName 特性只对 System.Text.Json 生效,对 Newtonsoft.Json 无效(后者用 [JsonProperty("first_name")])。
用 Newtonsoft.Json(Json.NET)的典型陷阱
老项目还在用 Newtonsoft.Json?它灵活但默认行为更“宽容”,容易掩盖问题。
-
JsonConvert.DeserializeObject<T>(json)对缺失字段默认设为默认值(如int→0),而System.Text.Json默认报错;可通过DefaultValueHandling.IgnoreAndPopulate模拟 - 若 JSON 含注释(如
// config)或尾随逗号,Newtonsoft.Json默认允许,System.Text.Json直接拒绝——上线前务必确认 JSON 格式合规 - 反序列化
DateTime时,Newtonsoft.Json默认按本地时区解析,System.Text.Json默认当 UTC 处理;跨时区场景务必检查JsonSerializerOptions.DateTimeZoneHandling或JsonConvert.DefaultSettings
大文件或流式读取时别一次性 ReadAllText
读取几十 MB 的 JSON 日志文件?File.ReadAllText 会把整个文件加载进内存,极易触发 OutOfMemoryException。
- 改用
FileStream+Utf8JsonReader手动流式解析(适合只取其中几个字段) - 或用
JsonDocument.Parse(stream)构建只读 DOM,再查路径(如doc.RootElement.GetProperty("items").EnumerateArray()),内存占用比全量反序列化低 -
StreamReader包裹FileStream时,务必传leaveOpen: true,否则JsonSerializer.DeserializeAsync会关闭底层流,后续无法复用
真正难的不是语法,是搞清 JSON 实际结构、编码、时区、空值语义——这些细节不验,跑起来才出错。










