【问题标题】:Automapper Serialize/Deserialize source string to list using resolverAutomapper 序列化/反序列化源字符串以使用解析器列出
【发布时间】:2022-04-08 18:36:39
【问题描述】:

我正在尝试将源字符串映射到成员的List<T>,但映射的成员列表属性的值始终为空。

这是我的代码。

//Source model
public class Claims
{  
    public int Id { get; set; } 
    public string ClaimType {get; set; } 
    public string ClaimValue { get; set; } // produce json string [{"Action":"read","Status":"active"}]
}

// Dest model
public class ClaimsDto
{  
   public int Id { get; set; }
   public string ClaimType { get; set; } 
   public List<ResourceActions> ClaimValues { get; set; }
}


public class ResourceActions
{
  public string Action { get; set; }
  public string Status { get; set; }
}



CreateMap<ResourceActions, ResourceActions>();

CreateMap<Claims, ClaimsDto>()
.ForMember(dest => dest.ClaimValues,
 opt => opt.MapFrom( src=> JsonConvert.DeserializeObject<List<ResourceActions>>(src.ClaimValue))) 
.ReverseMap();

也尝试过这样的解析器。

 .ForMember(dto => dto.ClaimValues, opt => opt.ResolveUsing<CustomResolver,string>(src=>src.ClaimValue ))

解析器:

public class CustomResolver : IMemberValueResolver<Claims, ClaimsDto, string, List<ResourceActions>>
{
    public List<ResourceActions> Resolve(Claims source, ClaimsDto destination, string sourceMember, List<ResourceActions> destinationMember, ResolutionContext context)
    {
        var data = JsonConvert.DeserializeObject<List<ResourceActions>>(sourceMember);
        return context.Mapper.Map<List<ResourceActions>>(data); // not working
        return JsonConvert.DeserializeObject<List<ResourceActions>>(sourceMember); // not working
    }
}

还有控制器

var mapped = _mapper.Map<List<ClaimsDto>>(source); // success without exception but the list property is null.

除此 string 之外的其他属性已映射到 List&lt;T&gt; 属性。

【问题讨论】:

  • 请同时提供你的json
  • source 的值是多少?我已经试用了你的代码,它对我有用。
  • @rigoryants-artem 此源 json 需要将 [{"Action":"create","Status":"active"},{"Action":"read","Status":"active"},{"Action":"update","Status":"active"},{"Action":"delete","Status":"active"}] 映射到此目标属性 public List&lt;ResourceActions&gt; ClaimValues { get; set; }
  • @Patko 你能按照你的做法创建一个到 GitHub 的仓库吗?谢谢。

标签: c# asp.net-mvc asp.net-core asp.net-core-mvc automapper


【解决方案1】:

我认为这个配置文件应该可以解决问题:

public class MyMapperProfile : Profile
{
    public MyMapperProfile()
    {
        CreateMap<Claims, ClaimsDto>()
            .ForMember(dto => dto.ClaimValues, cfg => cfg.MapFrom((claim, _) =>
               JsonSerializer.Deserialize<IReadOnlyCollection<ResourceActions>>(claim.ClaimValue)));
    }
}

这里是an example

var config = new MapperConfiguration(cfg => cfg.AddProfile<MyMapperProfile>());
var mapper = config.CreateMapper();

var someClaims = new List<Claims>
{
    new Claims { Id = 5, ClaimType = "Foo", ClaimValue = @"[{""Action"":""read"",""Status"":""active""}]" },
    new Claims { Id = 7, ClaimType = "Bar", ClaimValue = @"[{""Action"":""create"",""Status"":""disabled""}]" },
};

var result = mapper.Map<List<ClaimsDto>>(someClaims);

foreach (var item in result)
{
    Console.WriteLine(JsonSerializer.Serialize(item));
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-10
    • 2015-11-26
    • 2018-10-22
    • 2023-03-23
    • 1970-01-01
    • 2019-08-22
    • 1970-01-01
    相关资源
    最近更新 更多