Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用Automapper映射此内容_C#_Asp.net_Json_Json.net_Automapper - Fatal编程技术网

C# 如何使用Automapper映射此内容

C# 如何使用Automapper映射此内容,c#,asp.net,json,json.net,automapper,C#,Asp.net,Json,Json.net,Automapper,我需要绘制以下场景 public class Customer { public string CustomerJson { get; set; } } public class CustomerTO { public object CustomerJson { get; set; } } 我从DAL中获得CustomerJson值,如下所示 Customer.CustomerJson = { "name": "Ram", "city": "India" }

我需要绘制以下场景

public class Customer
{
    public string CustomerJson { get; set; }
}

public class CustomerTO
{
     public object CustomerJson { get; set; }
}
我从DAL中获得CustomerJson值,如下所示

Customer.CustomerJson = {
    "name": "Ram",
    "city": "India"
}
我需要反序列化此字符串。因此,我在映射时尝试了以下内容

var config = new MapperConfiguration(cfg =>
                    {
                        cfg.CreateMap<Customer, CustomerTO>()
                        .ForMember(dest => dest.CustName, opt => opt.MapFrom(src => JsonConvert.DeserializeObject(src.CustName)));
                    });
class DAL
{
    public CustomerTO GetCustomers()
    {
        var customers= //LINQ To get customers 

        var customerTO = Mapping(customer);

        return customerTO;

    }
    //However, this mapping glue in some internal class to retain SOLID principles
    private CustomerTO Mapping(Customer custEntity)
    {
        var custTO = _appMapper.Map(custEntity);
        var str = JsonConvert.Serialize(custTO.CustomerData);
        custTO.CustomerData = JsonConvert.Deserialize(str);
        return custTO;
    }
}
错误2“Newtonsoft.Json.JsonConvert.DeserializeObject(string)”的最佳重载方法匹配具有一些无效参数

我知道customerTO.CustomerJson不是字符串,但我应该如何进行所需的映射

谢谢。

根据您的回答,并且根据上面的信息,您似乎对您在这里要做的事情感到困惑

因此,我将合并来自两者的数据,试图解决这些问题

实体类:

public class Customer
{
    public int CustomerId {get; set; }
    public string CustomerName { get; set; }
    public string CustomerJson { get; set; }
}

public class CustomerTO
{
    public int CustId { get; set; }
    public object CustData { get; set; }
    public object CustomerJson { get; set; }
}
public static class AppMapper
{
    public static MapperConfiguration Mapping()
    {
        return new MapperConfiguration(cfg =>
            {
                cfg.CreateMap<Customer, CustomerTO>()
                .ForMember(dest => dest.CustId, opt => opt.MapFrom(src => src.CustomerId))
                .ForMember(dest => dest.CustData, opt => opt.MapFrom(src => src.CustName))
                .ForMember(dest => dest.CustomerJson, opt => opt.MapFrom(src => JsonConvert.DeserializeObject(src.CustomerJson));
            });
    }
}
public class Program
{
    static void Main(string[] args)
    {
        var config = AppMapper.Mapping();
        var mapper = config.CreateMapper();

        // From Previous question get list of Customer objects
        var customers = AddCustomers();
        var mappedCustomers = mapper.Map<IEnumerable<CustomerTO>>(customers);
    }
}
AppMapper类:

public class Customer
{
    public int CustomerId {get; set; }
    public string CustomerName { get; set; }
    public string CustomerJson { get; set; }
}

public class CustomerTO
{
    public int CustId { get; set; }
    public object CustData { get; set; }
    public object CustomerJson { get; set; }
}
public static class AppMapper
{
    public static MapperConfiguration Mapping()
    {
        return new MapperConfiguration(cfg =>
            {
                cfg.CreateMap<Customer, CustomerTO>()
                .ForMember(dest => dest.CustId, opt => opt.MapFrom(src => src.CustomerId))
                .ForMember(dest => dest.CustData, opt => opt.MapFrom(src => src.CustName))
                .ForMember(dest => dest.CustomerJson, opt => opt.MapFrom(src => JsonConvert.DeserializeObject(src.CustomerJson));
            });
    }
}
public class Program
{
    static void Main(string[] args)
    {
        var config = AppMapper.Mapping();
        var mapper = config.CreateMapper();

        // From Previous question get list of Customer objects
        var customers = AddCustomers();
        var mappedCustomers = mapper.Map<IEnumerable<CustomerTO>>(customers);
    }
}
公共静态类AppMapper
{
公共静态MapperConfiguration映射()
{
返回新的MapperConfiguration(cfg=>
{
cfg.CreateMap()
.FormMember(dest=>dest.CustId,opt=>opt.MapFrom(src=>src.CustomerId))
.FormMember(dest=>dest.CustData,opt=>opt.MapFrom(src=>src.CustName))
.FormMember(dest=>dest.CustomerJson,opt=>opt.MapFrom(src=>JsonConvert.DeserializeObject(src.CustomerJson));
});
}
}
Main:

public class Customer
{
    public int CustomerId {get; set; }
    public string CustomerName { get; set; }
    public string CustomerJson { get; set; }
}

public class CustomerTO
{
    public int CustId { get; set; }
    public object CustData { get; set; }
    public object CustomerJson { get; set; }
}
public static class AppMapper
{
    public static MapperConfiguration Mapping()
    {
        return new MapperConfiguration(cfg =>
            {
                cfg.CreateMap<Customer, CustomerTO>()
                .ForMember(dest => dest.CustId, opt => opt.MapFrom(src => src.CustomerId))
                .ForMember(dest => dest.CustData, opt => opt.MapFrom(src => src.CustName))
                .ForMember(dest => dest.CustomerJson, opt => opt.MapFrom(src => JsonConvert.DeserializeObject(src.CustomerJson));
            });
    }
}
public class Program
{
    static void Main(string[] args)
    {
        var config = AppMapper.Mapping();
        var mapper = config.CreateMapper();

        // From Previous question get list of Customer objects
        var customers = AddCustomers();
        var mappedCustomers = mapper.Map<IEnumerable<CustomerTO>>(customers);
    }
}
公共类程序
{
静态void Main(字符串[]参数)
{
var config=AppMapper.Mapping();
var mapper=config.CreateMapper();
//从上一个问题中获取客户对象列表
var customers=AddCustomers();
var mappedCustomers=mapper.Map(客户);
}
}
需要指出的几件事 我不确定
CustData
CustomerTO
中的作用是什么。它似乎在复制
CustomerJson
,如果是,请删除它和相关映射

此外,您从未提及从DTO映射回实体,但对于JsonObject,您只需要将其配置为将序列化字符串映射到适当的属性。

基于您的数据,并且给出了上面的信息,您似乎对这里要做的事情感到困惑

因此,我将合并来自两者的数据,试图解决这些问题

实体类:

public class Customer
{
    public int CustomerId {get; set; }
    public string CustomerName { get; set; }
    public string CustomerJson { get; set; }
}

public class CustomerTO
{
    public int CustId { get; set; }
    public object CustData { get; set; }
    public object CustomerJson { get; set; }
}
public static class AppMapper
{
    public static MapperConfiguration Mapping()
    {
        return new MapperConfiguration(cfg =>
            {
                cfg.CreateMap<Customer, CustomerTO>()
                .ForMember(dest => dest.CustId, opt => opt.MapFrom(src => src.CustomerId))
                .ForMember(dest => dest.CustData, opt => opt.MapFrom(src => src.CustName))
                .ForMember(dest => dest.CustomerJson, opt => opt.MapFrom(src => JsonConvert.DeserializeObject(src.CustomerJson));
            });
    }
}
public class Program
{
    static void Main(string[] args)
    {
        var config = AppMapper.Mapping();
        var mapper = config.CreateMapper();

        // From Previous question get list of Customer objects
        var customers = AddCustomers();
        var mappedCustomers = mapper.Map<IEnumerable<CustomerTO>>(customers);
    }
}
AppMapper类:

public class Customer
{
    public int CustomerId {get; set; }
    public string CustomerName { get; set; }
    public string CustomerJson { get; set; }
}

public class CustomerTO
{
    public int CustId { get; set; }
    public object CustData { get; set; }
    public object CustomerJson { get; set; }
}
public static class AppMapper
{
    public static MapperConfiguration Mapping()
    {
        return new MapperConfiguration(cfg =>
            {
                cfg.CreateMap<Customer, CustomerTO>()
                .ForMember(dest => dest.CustId, opt => opt.MapFrom(src => src.CustomerId))
                .ForMember(dest => dest.CustData, opt => opt.MapFrom(src => src.CustName))
                .ForMember(dest => dest.CustomerJson, opt => opt.MapFrom(src => JsonConvert.DeserializeObject(src.CustomerJson));
            });
    }
}
public class Program
{
    static void Main(string[] args)
    {
        var config = AppMapper.Mapping();
        var mapper = config.CreateMapper();

        // From Previous question get list of Customer objects
        var customers = AddCustomers();
        var mappedCustomers = mapper.Map<IEnumerable<CustomerTO>>(customers);
    }
}
公共静态类AppMapper
{
公共静态MapperConfiguration映射()
{
返回新的MapperConfiguration(cfg=>
{
cfg.CreateMap()
.FormMember(dest=>dest.CustId,opt=>opt.MapFrom(src=>src.CustomerId))
.FormMember(dest=>dest.CustData,opt=>opt.MapFrom(src=>src.CustName))
.FormMember(dest=>dest.CustomerJson,opt=>opt.MapFrom(src=>JsonConvert.DeserializeObject(src.CustomerJson));
});
}
}
Main:

public class Customer
{
    public int CustomerId {get; set; }
    public string CustomerName { get; set; }
    public string CustomerJson { get; set; }
}

public class CustomerTO
{
    public int CustId { get; set; }
    public object CustData { get; set; }
    public object CustomerJson { get; set; }
}
public static class AppMapper
{
    public static MapperConfiguration Mapping()
    {
        return new MapperConfiguration(cfg =>
            {
                cfg.CreateMap<Customer, CustomerTO>()
                .ForMember(dest => dest.CustId, opt => opt.MapFrom(src => src.CustomerId))
                .ForMember(dest => dest.CustData, opt => opt.MapFrom(src => src.CustName))
                .ForMember(dest => dest.CustomerJson, opt => opt.MapFrom(src => JsonConvert.DeserializeObject(src.CustomerJson));
            });
    }
}
public class Program
{
    static void Main(string[] args)
    {
        var config = AppMapper.Mapping();
        var mapper = config.CreateMapper();

        // From Previous question get list of Customer objects
        var customers = AddCustomers();
        var mappedCustomers = mapper.Map<IEnumerable<CustomerTO>>(customers);
    }
}
公共类程序
{
静态void Main(字符串[]参数)
{
var config=AppMapper.Mapping();
var mapper=config.CreateMapper();
//从上一个问题中获取客户对象列表
var customers=AddCustomers();
var mappedCustomers=mapper.Map(客户);
}
}
需要指出的几件事 我不确定
CustData
CustomerTO
中的作用是什么。它似乎在复制
CustomerJson
,如果是,请删除它和相关映射


另外,您从来没有提到从DTO映射回实体,但是对于JsonObject,您只需要将其配置为将序列化字符串映射到相应的属性。

这就是我如何解决我的需求的

数据库实体

public class Customer 
{
   public string CustomerData { get; set; }
   // & other properties 
}
我的DTO

public class CustomerTO
{
   public object CustomerData { get; set;}
   // & other properties
}
我创建了一个名为AppMapper的类似实用程序的类。这就是我的AppMapper.cs的外观

public class AppMapper
{
    private IMapper _mapper;
    public AppMapper()
    {
        var config = new MapperConfiguration(cfg =>
        {
            cfg.CreateMap<Customer, CustomerTO>();
            //& other such mapping
        });

        _mapper = config.CreateMapper();
    }

public CustomerTO Map(Customer customerEntity)
    {
        var customerTo= _mapper.Map<Customer,CustomerTO>(customerEntity);
        return customerTo;
    }
就这样

@巴里·奥凯恩-衷心感谢您的投入

需要注意的要点:-

  • 我不需要手动映射任何属性,因为属性名是相同的。另外,我正在将字符串转换为对象。所以没有问题
  • 如果对一个属性使用
    .Map()
    ,则我发现需要映射每个属性,否则它会给出数据类型的默认值。(例如,对于int,它会给出0)
  • 是的。我同意Automapper中可能有其他方法,允许我指定对特定属性执行此手动映射,对rest使用Automapping机制。但我不确定这一点

    请随时以任何方式改进此ans


    希望这有帮助:)

    这就是我如何满足我的要求的

    数据库实体

    public class Customer 
    {
       public string CustomerData { get; set; }
       // & other properties 
    }
    
    我的DTO

    public class CustomerTO
    {
       public object CustomerData { get; set;}
       // & other properties
    }
    
    我创建了一个名为AppMapper的类似实用程序的类。这就是我的AppMapper.cs的外观

    public class AppMapper
    {
        private IMapper _mapper;
        public AppMapper()
        {
            var config = new MapperConfiguration(cfg =>
            {
                cfg.CreateMap<Customer, CustomerTO>();
                //& other such mapping
            });
    
            _mapper = config.CreateMapper();
        }
    
    public CustomerTO Map(Customer customerEntity)
        {
            var customerTo= _mapper.Map<Customer,CustomerTO>(customerEntity);
            return customerTo;
        }
    
    就这样

    @巴里·奥凯恩-衷心感谢您的投入

    需要注意的要点:-

  • 我不需要手动映射任何属性,因为属性名是相同的。另外,我正在将字符串转换为对象。所以没有问题
  • 如果对一个属性使用
    .Map()
    ,则我发现需要映射每个属性,否则它会给出数据类型的默认值。(例如,对于int,它会给出0)
  • 是的。我同意Automapper中可能有其他方法,允许我指定对特定属性执行此手动映射,对rest使用Automapping机制。但我不确定这一点

    请随时以任何方式改进此ans


    希望这有帮助:)

    customerTO.CustomerJson
    是一个对象,而不是字符串。阅读异常消息…@Callumlington,是的。我知道如何映射这是我的问题花更多的时间阅读和理解文档
    customerTO。CustomerJson
    是一个对象,而不是字符串。阅读异常消息…@Callumlington,是的。我知道如何绘制地图这是我的问题花更多的时间阅读和理解文档很高兴我能帮忙:)很高兴我能帮忙:)