You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# JsonSerializer反序列化JSON抛出转换异常如何解决

异常产生原因

这个报错是三个问题共同导致的:

  • 反序列化目标类型和JSON结构不匹配:待反序列化的JSON最外层是[]包裹的数组结构,但代码中调用JsonSerializer.Deserialize时指定的泛型类型是单个CmsContactsFilter对象,序列化器读取到首字符[时就发现类型不匹配,直接抛出位置0行1字节的转换错误。
  • JSON字符串本身存在语法错误:
    1. 第一个配置对象闭合的}之后,缺失第二个配置对象的起始括号{
    2. 数组最后一个元素末尾多了冗余逗号,不符合JSON语法规范
  • 属性映射不匹配:第二个JSON对象中存储数组值的键名是abc,和POCO类中定义的Group属性名不一致,默认的System.Text.Json序列化规则为严格匹配属性名,即使语法修正后这部分值也无法正确映射。
修复方案

按以下步骤调整即可解决问题:

  1. 修正JSON常量的语法错误,补全缺失括号、删除冗余逗号,统一属性名(如果abc为笔误的话),修正后的JSON定义如下:
const string FilterJson = @"[{""cms"":""us-its"",""group"":[""ciso"",""cloudAdminsDistributionList"",""cloudAdmins""]},{""cms"":""us-csdaudit"",""group"":[""biso"",""costManagement""]}]";
  1. 调整反序列化的目标类型为集合类型,匹配JSON的数组结构:
try
{
    // 目标类型改为List<CmsContactsFilter>
    var filters = JsonSerializer.Deserialize<List<CmsContactsFilter>>(FilterJson);
}
catch(Exception ex)
{
    // 自定义异常处理逻辑
}
  1. (可选配置)如果需要兼容大小写差异、或者确实存在键名和属性名不一致的场景,可以配置序列化选项,或者给属性加映射特性:
// 配置序列化规则
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 01:33:20