C#中JSON反序列化为对象时属性不匹配如何抛出并捕获错误?
实现JSON属性与C#类属性不匹配时抛出错误的方案
这个需求完全可以实现,通过配置System.Text.Json的序列化选项即可达成。
核心配置要点
默认情况下System.Text.Json会忽略JSON中C#类未定义的属性,也不会因C#类属性在JSON中缺失报错。要触发属性不匹配错误,需调整两个关键设置:
UnknownTypeHandling:将JsonSerializerOptions的该属性设为JsonUnknownTypeHandling.JsonException,JSON中出现C#类未定义的属性时就会抛出异常。[JsonRequired]特性:给C#类的属性添加该特性,强制要求JSON中必须包含对应属性,缺失时直接抛出异常。
修改后的完整C#代码
// See https://aka.ms/new-console-template for more information using static System.Console; using System.Text.Json; using System.Text.Json.Serialization; List<Person> source = new List<Person>(); // 配置反序列化选项 var options = new JsonSerializerOptions { UnknownTypeHandling = JsonUnknownTypeHandling.JsonException, PropertyNameCaseInsensitive = false // 可选:开启严格大小写匹配,大小写不匹配也视为属性不匹配 }; try { using (StreamReader r = new StreamReader("data.json")) { string json = r.ReadToEnd(); source = JsonSerializer.Deserialize<List<Person>>(json, options); foreach (Person person in source) { WriteLine(person.Id); } } } catch (JsonException ex) { WriteLine($"JSON反序列化错误:{ex.Message}"); } public class Person { [JsonRequired] public int Id { get; set; } [JsonRequired] public string Firstname { get; set; } [JsonRequired] public string Lastname { get; set; } [JsonRequired] public string City { get; set; } }
触发错误的典型场景
- JSON中包含C#类未定义的属性:比如给JSON对象添加
"Age":30,反序列化时会抛出JsonException提示存在未知属性。 - JSON缺失C#类标记了
[JsonRequired]的属性:比如某个JSON对象去掉"City"字段,会触发必填属性缺失的异常。 - 开启严格大小写匹配后,JSON属性名与C#类属性名大小写不一致:比如JSON写
"firstname"而C#类是Firstname,会被判定为属性缺失抛出错误。
补充说明
如果不需要严格区分属性大小写,可将PropertyNameCaseInsensitive设为true(默认值),此时只有属性名完全不存在或缺失必填项时才会报错。捕获JsonException即可处理所有属性不匹配导致的反序列化错误。
内容的提问来源于stack exchange,提问作者Musaffar Patel
相关产品推荐
相关产品推荐

