.NET 7中Mapster嵌套集合映射失败问题求助
Mapster二级嵌套集合映射失败的原因与解决方法
问题原因
- 循环引用触发递归映射中断:你在
TestB → B的配置中手动映射dest.A = src.TestA.Adapt<A>(),这会触发TestA → A的映射,而TestA → A又会处理Bs集合,进而再次触发TestB → B的映射,形成无限递归。Mapster为防止栈溢出,会自动跳过循环引用中的部分映射逻辑,导致Cs集合未被正确处理。 - 手动调用Adapt丢失映射上下文:在
TestA → A的配置中,你手动使用src.TestBs.Adapt<List<B>>()映射集合,这种方式没有复用已注册的TestB → B映射配置上下文,导致嵌套的Cs集合映射逻辑未被执行。
解决方案
修改映射配置,移除循环引用的手动映射,让Mapster自动处理嵌套集合和循环引用:
简化版映射配置
public class TestMapping : IRegister { public void Register(TypeAdapterConfig config) { // 启用循环引用处理,避免无限递归 config.Default.IgnoreCycles(); // 所有属性名称和类型匹配,Mapster会自动完成映射,无需手动配置每个属性 } }
自定义属性映射版(若需保留部分手动配置)
public class TestMapping : IRegister { public void Register(TypeAdapterConfig config) { config.Default.IgnoreCycles(); config.NewConfig<TestA, A>() .Map(dest => dest.Id, src => src.Id); config.NewConfig<TestB, B>() .Map(dest => dest.Id, src => src.Id) .Ignore(dest => dest.A); // 可选:若不需要B中的A对象,直接忽略避免循环引用 config.NewConfig<TestC, C>() .Map(dest => dest.Id, src => src.Id); } }
修改后测试结果
运行原测试代码,输出的JSON会正确包含Cs集合:
{ "id": 1, "bs": [ { "id": 1, "a": null, "cs": [ { "id": 1 } ] }, { "id": 2, "a": null, "cs": [ { "id": 2 } ] } ] }
内容的提问来源于stack exchange,提问作者mahbuburrahman rifat
相关产品推荐
相关产品推荐

