Automapper无法绑定泛型列表:JSON转Model列表为空问题求助
解决AutoMapper从JArray映射到List为空的问题
我来帮你搞定这个问题!你遇到的空列表问题,核心原因是AutoMapper不知道如何将JArray直接关联到Listcfg.CreateMap<JArray, List<Student>>(),但这个映射没有实际的转换规则,而且你的Profile类和Model类同名(都叫Student),这也会导致潜在的冲突。下面是具体的修正方案:
第一步:修正Profile类的命名与映射细节
首先把Profile类重命名,避免和Model类冲突,同时完善类型转换细节(JSON里的数字要转成string类型匹配RoleId):
// 重命名Profile类,避免与Student Model冲突 public class StudentProfile : Profile { public StudentProfile() { CreateMap<JObject, Student>() .ForMember(dest => dest.Name, opt => opt.MapFrom(src => src["Code"])) .ForMember(dest => dest.Age, opt => opt.MapFrom(src => src["Code"])) // 确认这是你的业务需求哦 .ForMember(dest => dest.RoleId, opt => opt.MapFrom(src => src["HighLevelClassOfBusinessCode"].ToString())); } }
第二步:修改AutoMapper映射方法
AutoMapper对集合有内置支持,只要你配置了单个元素(JObject→Student)的映射,它会自动处理JArray到List
public List<Student> GetNewList(JArray jsonData) { // 只需要添加我们的Profile,AutoMapper会自动处理集合映射 var config = new MapperConfiguration(cfg => { cfg.AddProfile<StudentProfile>(); }); // 可选:验证映射配置是否正确,提前发现问题 config.AssertConfigurationIsValid(); var mapper = config.CreateMapper(); // 直接映射JArray到List<Student>,AutoMapper会遍历每个JObject应用已配置的规则 List<Student> newData = mapper.Map<List<Student>>(jsonData); return newData; }
为什么原来的写法不行?
你之前手动添加的cfg.CreateMap<JArray, List<Student>>()覆盖了AutoMapper默认的集合处理逻辑,导致它没有使用你在Profile里配置的JObject→Student映射规则。而循环逐个映射时,你直接调用了JObject到Student的映射,所以能正常工作。
测试示例
用你的JSON数据测试一下,现在能得到正确的结果:
var jsonText = @" [ { ""Code"" : ""Class786"", ""HighLevelClassOfBusinessCode"" :3 }, { ""Code"" : ""Class789"", ""HighLevelClassOfBusinessCode"" :79 } ]"; JArray jsonData = JArray.Parse(jsonText); var result = GetNewList(jsonData); // result会包含两个Student对象: // 第一个:Name=Class786,Age=Class786,RoleId="3" // 第二个:Name=Class789,Age=Class789,RoleId="79"
内容的提问来源于stack exchange,提问作者Umesh Shende
相关产品推荐
相关产品推荐

