c# - 如何使用 JsonProperty 属性配置 AutoMapper

标签 c# json json.net automapper

我需要如何配置 AutoMapper 才能使用 JsonProperty 将包含“C”和“D”列的 DataTable 转换为 MyClass 列表映射属性?

public class MyClass
{
     [JsonProperty("C")]
     public string A { get; set; }
     [JsonProperty("D")]
     public string B { get; set; }
}

最佳答案

使用 Json.NET 自己的元数据 contract resolver您可以从 IDataRecord 配置名称映射到您类型的属性MyClass 。完成此操作后,您可以从任何 IDataReader 进行映射。包括 DataTable.CreateDataReader() 返回的那个到您的类型的实例列表。

首先添加以下扩展方法:

public static class AutomapperJsonExtensions
{
    static readonly IContractResolver defaultResolver = new JsonSerializer().ContractResolver;

    public static void CreateJsonDataReaderMap<TDestination>(this IMapperConfigurationExpression cfg, IContractResolver resolver = null)
    {
        resolver = resolver ?? defaultResolver;
        var contract = resolver.ResolveContract(typeof(TDestination)) as JsonObjectContract ?? throw new ArgumentException(string.Format("{0} is not a JSON object.", typeof(TDestination)));

        var map = cfg.CreateMap<IDataRecord, TDestination>();

        foreach (var p in contract.Properties.Where(p => !p.Ignored && p.Writable))
        {
            // Map PropertyName in reader to UnderlyingName in TDestination
            map.ForMember(p.UnderlyingName, opt => opt.MapFrom(r => r[p.PropertyName]));
        }
    }
}

现在您可以配置 MapperConfiguration 并将您的表映射到 List<MyClass>如下:

var config = new MapperConfiguration(cfg =>
{
    cfg.CreateJsonDataReaderMap<MyClass>();
});
var mapper = config.CreateMapper();
using var reader = table.CreateDataReader();
var result = mapper.Map<List<MyClass>>(reader);

注释:

  • 对表中存在但类中不存在的属性的错误处理尚未实现,但大概可以实现。

  • 如果您的表是使用驼峰式列名创建的,您可以传递 CamelCasePropertyNamesContractResolver 的实例。作为 CreateJsonDataReaderMap() 的第二个参数并且名称应该正确映射。

演示 fiddle here它使用 AutoMapper 版本 9。

关于c# - 如何使用 JsonProperty 属性配置 AutoMapper,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62199220/

相关文章:

c# - 无数据类型的开销是多少?

ios - 如何在 Swift 中解析特定的 JSON

javascript - 如何通过 appcelerator 中的 JSON 解析从对象数组中检索值

c# - 处理 1.x 的 onDisconnected() 方法到 SignalR 2.1.2

c# - JSON 反序列化为 KeyValuePair 返回 {null,null}

c# - RestSharp/Json.NET 将数组序列化为 JSON 对象

c# - 我可以在 C# 中将正则表达式与 String.Replace 一起使用吗?

c# - 使用 C# 5 异步等待在多个游戏帧上执行的内容

c# - 根据通用参数类型切换

python - 将分层 JSON 文件导入 Pandas 数据框