C# JsonSerializer反序列化JSON抛出转换异常如何解决
异常产生原因
这个报错是三个问题共同导致的:
- 反序列化目标类型和JSON结构不匹配:待反序列化的JSON最外层是
[]包裹的数组结构,但代码中调用JsonSerializer.Deserialize时指定的泛型类型是单个CmsContactsFilter对象,序列化器读取到首字符[时就发现类型不匹配,直接抛出位置0行1字节的转换错误。 - JSON字符串本身存在语法错误:
- 第一个配置对象闭合的
}之后,缺失第二个配置对象的起始括号{ - 数组最后一个元素末尾多了冗余逗号,不符合JSON语法规范
- 第一个配置对象闭合的
- 属性映射不匹配:第二个JSON对象中存储数组值的键名是
abc,和POCO类中定义的Group属性名不一致,默认的System.Text.Json序列化规则为严格匹配属性名,即使语法修正后这部分值也无法正确映射。
修复方案
按以下步骤调整即可解决问题:
- 修正JSON常量的语法错误,补全缺失括号、删除冗余逗号,统一属性名(如果
abc为笔误的话),修正后的JSON定义如下:
const string FilterJson = @"[{""cms"":""us-its"",""group"":[""ciso"",""cloudAdminsDistributionList"",""cloudAdmins""]},{""cms"":""us-csdaudit"",""group"":[""biso"",""costManagement""]}]";
- 调整反序列化的目标类型为集合类型,匹配JSON的数组结构:
try { // 目标类型改为List<CmsContactsFilter> var filters = JsonSerializer.Deserialize<List<CmsContactsFilter>>(FilterJson); } catch(Exception ex) { // 自定义异常处理逻辑 }
- (可选配置)如果需要兼容大小写差异、或者确实存在键名和属性名不一致的场景,可以配置序列化选项,或者给属性加映射特性:
// 配置序列化规则 var jsonOptions = new JsonSerializerOptions { // 开启属性名大小写不敏感匹配,比如cms/CMS都能映射到Cms属性 PropertyNameCaseInsensitive = true }; // 若键名abc不是笔误,需要给POCO类加JsonPropertyName特性 // public class CmsContactsFilter // { // [JsonPropertyName("cms")] // public string Cms { get; set; } // [JsonPropertyName("abc")] // public List<string> Group { get; set; } // } // 传配置参数反序列化 var filters = JsonSerializer.Deserialize<List<CmsContactsFilter>>(FilterJson, jsonOptions);
内容的提问来源于stack exchange,提问作者Tech with Thiru
相关产品推荐
相关产品推荐

