首页 > 解决方案 > 当源为空时如何防止 AutoMapper 初始化目标 JObject 成员

问题描述

假设您有以下类:

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导致 null json 的值(例如,一个 null 值、一个空字符串或字符串“null”,所有这些都会导致 JsonConvert 返回 null),最终的值Destination.Data被设置为空 JObject 而不是 null。

有没有办法阻止 Automapper 初始化目标成员?

您可以做一些不同的事情,但其中大多数只涵盖部分案例。例如,您可以向映射添加条件以仅在Source.Data不为空或不为空时应用。Source.Data但如果是字符串“null”,这将不起作用。

有没有更好的方法来处理这个而不需要在外面添加一堆特殊的套管条件?

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

标签: c#json.netautomapperautomapper-6

解决方案


AllowNullCollections 适用于每个配置文件,但每个属性,您可以尝试如下:

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

问题是,您解决的问题会再次映射,如果 AllowNullCollections 为假,AM 将不得不为您创建一个 :) 另请参阅


推荐阅读