使用AutoMapper将字符串映射为List<T>是否可行?
可以实现
完全可以把Source类的JsonItems字符串属性映射到Dest类的只读Items列表属性,下面是两种常用的实现方式:
手动映射
这种方式不需要依赖第三方工具,直接借助JSON序列化库完成转换:
第一步:给Dest类添加构造函数
由于Dest的Items是只读属性(只有get访问器),必须通过类的构造函数来初始化这个列表:
class Dest { public List<Item> Items { get; } // 添加接收列表的构造函数 public Dest(List<Item> items) { // 避免传入null,初始化空列表 Items = items ?? new List<Item>(); } }
第二步:完成映射操作
使用System.Text.Json(.NET Core/5+内置)或者Newtonsoft.Json来反序列化JSON字符串,再实例化Dest:
// 使用System.Text.Json的示例 var source = new Source { JsonItems = "[{\"Id\":1,\"Name\":\"示例\"}]" }; var items = JsonSerializer.Deserialize<List<Item>>(source.JsonItems); var dest = new Dest(items); // 使用Newtonsoft.Json的示例(需先安装Newtonsoft.Json包) // var items = JsonConvert.DeserializeObject<List<Item>>(source.JsonItems); // var dest = new Dest(items);
使用AutoMapper实现
如果项目中已经在用AutoMapper,可以通过自定义映射规则来完成:
第一步:配置映射规则
在AutoMapper的配置中,指定从Source.JsonItems反序列化为Dest.Items:
var mapperConfig = new MapperConfiguration(cfg => { cfg.CreateMap<Source, Dest>() .ForMember(dest => dest.Items, opt => opt.MapFrom(src => JsonSerializer.Deserialize<List<Item>>(src.JsonItems))); }); // 创建映射器实例 var mapper = mapperConfig.CreateMapper();
第二步:执行映射
直接调用Map方法完成转换:
var source = new Source { JsonItems = "[{\"Id\":1,\"Name\":\"示例\"}]" }; var dest = mapper.Map<Dest>(source);
注意:如果
Dest没有提供接收列表的构造函数,AutoMapper会通过反射来设置只读属性,但这种方式不够优雅,更推荐给Dest添加构造函数来保证封装性。
内容的提问来源于stack exchange,提问作者k0st1x
相关产品推荐
相关产品推荐

