当源为空时,如何防止AutoMapper初始化目标JObject成员

时间:2018-11-30 00:41:54

标签: c# json.net automapper automapper-6

假设您具有以下课程:

public class Source
{
    public string Data { get; set; }
}

public class Destination
{
    public JObject Data { get; set; }
}

然后使用以下命令配置AutoMapper:

Mapper.Initialize(
    cfg =>
    {
        cfg.CreateMap<Source, Destination>()
            .ForMember(
                d => d.Data, 
                c => c.MapFrom(s => JsonConvert.DeserializeObject(s.Data ?? "")
    }
);

当您用Source的值映射Data对象时,会得到json值为空(例如,一个空值,一个空字符串或字符串“ null”,所有这些都将导致JsonConvert返回null),则Destination.Data的值最终被设置为空的JObject而不是null。

是否有办法完全阻止Automapper初始化目标成员?

您可以执行几项不同的操作,但其中大多数仅涵盖部分案例。例如,您可以向映射添加条件,以仅在Source.Data不为null或为空时应用。但是,如果Source.Data是字符串“ null”,则无法使用。

是否有更好的方法来处理此问题而无需在外部添加一堆特殊的套管条件?

侧注:我可以通过在字符串和JObject之间提供顶级映射来使其工作。但这意味着我在每种情况下都必须使用相同的逻辑,而我只希望它适用于这一属性。

1 个答案:

答案 0 :(得分:0)

AllowNullCollections可以针对每个配置文件运行,但可以针对每个属性尝试类似的操作:

cfg.CreateMap<Source, Destination>()
   .ForMember(destination => destination.Data, 
              options => options.AddTransform(data=>data.Count == 0 ? null : data));

问题是,您解析的内容将再次映射,如果AllowNullCollections为false,则AM必须为您创建一个:)另请参见this