如何简化AutoMapper中JToken到同名Model字段的映射配置?
简化JToken到ModelObject的AutoMapper映射配置
既然你的JSON键名和Model字段名称完全一致,完全不需要手动逐个配置ForMember,下面提供两种简洁的解决方案:
方案一:使用全局成员解析器(适合需保留AutoMapper扩展能力的场景)
自定义一个通用的JToken成员解析器,一次性处理所有字段的映射:
public class JTokenMemberResolver : IMemberValueResolver<JToken, object, string, object> { public object Resolve(JToken source, object destination, string sourceMember, object destMember, ResolutionContext context) { // sourceMember就是Model的字段名,直接匹配JSON键 var targetToken = source.SelectToken(sourceMember); return targetToken?.ToObject(destMember.GetType()); } }
然后修改你的Profile配置,只需一行即可完成所有字段映射:
public AutoMapperJSON() { CreateMap<JToken, ModelObject>() .ForAllMembers(opt => opt.ResolveUsing<JTokenMemberResolver>()); }
这种方式的好处是,如果后续需要对个别字段做特殊处理,可以直接在解析器里添加判断逻辑,不需要改动Profile的映射配置。
方案二:直接利用Newtonsoft的ToObject方法(最简洁的方案)
因为键名完全匹配,Newtonsoft.Json的JToken.ToObject<T>方法本身就能完成自动映射,你可以直接把这个逻辑整合到AutoMapper配置中:
public AutoMapperJSON() { CreateMap<JToken, ModelObject>() .ConstructUsing(src => src.ToObject<ModelObject>()); }
如果你的场景不需要AutoMapper的其他特性(比如映射链、类型转换扩展等),甚至可以直接跳过AutoMapper,直接调用:
ModelObject model = yourJToken.ToObject<ModelObject>();
注意事项
- 确保Model字段的类型与JSON对应值的类型兼容(比如JSON的字符串日期能被正确转换为Model的
DateTime类型) - 如果Model中有非公共字段,需要添加
[JsonProperty]属性指定对应键名(不过你当前的场景键名完全一致,公共字段无需额外配置)
内容的提问来源于stack exchange,提问作者Prosy A.
相关产品推荐
相关产品推荐

