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
相关产品推荐
相关产品推荐

