【问题标题】:Using Automapper to map from dynamic/JObject to arbitrary types without creating multiple maps使用 Automapper 从动态/JObject 映射到任意类型而不创建多个映射
【发布时间】:2017-11-24 12:12:53
【问题描述】:

在具有dynamic 类型参数的 ASP.NET Core 控制器方法中,我想使用 Automapper 进行映射,如下所示。该方法如下所示:

public IActionRsult Post([FromBody] dynamic model) {
  // Skip validation
  switch(model.src) {
    case "employer"
      var employerVM = _mapper.Map<EmployerViewModel>(model.data);
      // Work with mapped object
    break;
    case "employee"
      var employeeVM = _mapper.Map<EmployeeViewModel>(model.data);
      // Work with mapped object
    break;
  }
}

EmployerViewModel 看起来像这样:

public class EmployerViewModel {
   public string CompanyName {get; set;}
   public string CompanyAddress {get; set;}
}

EmployeeViewModel 看起来像这样:

public class EmployeeViewModel {
   public string FirstName {get; set;}
   public string LastName {get; set;}
   public bool Ready {get; set;} 
}

它从客户端接收 JSON 数据,可能如下所示:

{
  "src": "employer",
  "data": {
    "CompanyName": "Pioneers Ltd.",
    "CompanyAddress": "126 Schumacher St., London" 
  }
}

或者这个:

{
  "src": "employee",
  "data": {
    "FirstName": "John",
    "LastName": "Doe",
    "Ready": true
  }
}

现在一切正常,除了布尔属性,无论 JSON 中的值是什么,它总是设置为 false。我有 JSON 输入格式化程序,它在参数中构造实例。我检查了实例的类型,发现它们是 Newtonsoft.Json.Linq.JObject

知道如何让布尔值正确运行吗?

我想继续支持使用TDestination IMapper.Map&lt;TDestination&gt;(object source)(请参阅here)映射任意数量的目标类,而不必为每个类显式构造 AutoMapper 映射。任何提示如何实现这一点?

附:我正在使用 AutoMapper 6.2.1 和 ASP.NET Core 1.1.3

【问题讨论】:

  • 例如它与 ExpandoObject 一起工作,所以这是一个模型如何组合在一起的问题。
  • JSON 输入格式化程序在动态参数模型中打包了一个 Newtonsoft.Json.Linq.JObject 实例
  • 那么这就是您应该调查的内容。就 AM 而言,它是有效的。
  • 已编辑问题以强调由 JSON 输入格式化程序产生的 JObject

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


【解决方案1】:

问题在于JObject 将其内容包装在JValue 中,因此默认情况下它不能与AM 一起使用,当然AM 需要实际值。所以你必须让 AM 知道如何映射JValue

cfg.CreateMap<JValue, object>().ConvertUsing(source => source.Value);

【讨论】:

  • 就是这样!谢谢。将此转换器配置添加到 AutoMapper 映射配置文件后它工作
猜你喜欢
  • 2017-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-13
  • 2014-09-23
  • 2017-05-19
  • 1970-01-01
  • 2016-08-11
相关资源
最近更新 更多