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

C#:IEnumerable转Array失败,反序列化后Participants赋值为Null的问题咨询

问题分析与解决

你的问题核心出在不必要的ToString()调用,这直接导致类型转换失败,让myList变成了null。

为什么会出错?

当你用dynamic获取participantsJson.Participants时,这个对象本身已经是一个集合类型(大概率是JArray或者List<ParticipantJson>的动态等效物),但你调用了ToString()把它转换成了字符串。而字符串和IEnumerable<ParticipantJson>[]完全是不兼容的类型,用as转换时因为类型不匹配,自然返回null。

修正方案1:移除ToString(),直接转换

你可以直接对participantsJson.Participants进行类型转换,不需要先转成字符串:

private static List<ParticipantJson> GetListParticipants(string dossierJson) { 
    dynamic participantsJson = Newtonsoft.Json.JsonConvert.DeserializeObject<object>(dossierJson); 
    // 直接转换集合,不需要ToString()
    var myList = participantsJson.Participants as IEnumerable<ParticipantJson>; 
    return myList?.ToList() ?? new List<ParticipantJson>(); 
}

如果participantsJson.Participants的动态类型是JArray,还可以用显式反序列化的方式处理:

var participantsArray = participantsJson.Participants as JArray;
var myList = participantsArray?.ToObject<List<ParticipantJson>>() ?? new List<ParticipantJson>();

修正方案2:使用强类型反序列化(更推荐)

dynamic虽然灵活,但容易出现类型问题,更稳妥的方式是定义一个匹配JSON结构的容器类,直接反序列化到强类型:

// 定义容器类,匹配你的JSON结构
public class DossierJson
{
    public List<ParticipantJson> Participants { get; set; }
}

private static List<ParticipantJson> GetListParticipants(string dossierJson) { 
    var dossier = Newtonsoft.Json.JsonConvert.DeserializeObject<DossierJson>(dossierJson); 
    // 直接返回Participants,为空的话返回空列表避免null
    return dossier?.Participants ?? new List<ParticipantJson>(); 
}

这种方式类型安全,编译时就能发现错误,也不需要依赖dynamic的隐式转换,代码可读性和稳定性都更好。

内容的提问来源于stack exchange,提问作者MAK

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 15:57:42