Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.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# 反序列化自动映射中的动态对象?_C#_Asp.net Core_Automapper - Fatal编程技术网

C# 反序列化自动映射中的动态对象?

C# 反序列化自动映射中的动态对象?,c#,asp.net-core,automapper,C#,Asp.net Core,Automapper,我正在从第三方API获取一些数据。在响应中,我得到一个动态位置信息对象 { “国家代码3”:“SE”, “国家名称”:“瑞典”, “城市名称”:“马尔默”, “纬度”:86.69, “经度”:173.0551 } 现在我想获得country\u名称,并使用AutoMapper将其映射到propertycountry。为此,我想将上述动态JSON反序列化为LocationInfomodel: public class LocationInfo { public string Countr

我正在从第三方API获取一些数据。在响应中,我得到一个动态位置信息对象

{
“国家代码3”:“SE”,
“国家名称”:“瑞典”,
“城市名称”:“马尔默”,
“纬度”:86.69,
“经度”:173.0551
}
现在我想获得
country\u名称
,并使用AutoMapper将其映射到property
country
。为此,我想将上述动态JSON反序列化为
LocationInfo
model:

public class LocationInfo
{
    public string Country_Name { get; set; }
}
然后AutoMapper会将
国家/地区名称
映射到
国家/地区
。以下是我尝试过的:

.ForMember(dest => dest.Country, opts => opts.MapFrom(src => JsonConvert.DeserializeObject<LocationInfo>(src.LocationInfo).Country_Name); 
.ForMember(dest=>dest.Country,opts=>opts.MapFrom(src=>JsonConvert.DeserializeObject(src.LocationInfo).Country\u Name);
但它不起作用,我得到以下例外:

表达式树不能包含动态操作


当需要在映射内部执行某些方法时,可以使用
resolvesusing
方法。对于您的情况,它将是:

.ForMember(dest => dest.Country, opts => opts.ResolveUsing(src => JsonConvert.DeserializeObject<LocationInfo>(src.LocationInfo).Country_Name); 
.ForMember(dest=>dest.Country,opts=>opts.resolvesusing(src=>JsonConvert.DeserializeObject(src.LocationInfo).Country\u Name);

一般的经验法则是,当大多数(或全部)属性无法按约定映射时,不要使用AutoMapper,因为这忽略了它是“自动”的意义,看起来您的API正在返回JSON响应。我强烈建议使用
[JsonProperty(“国家名称”)]
在您的车型的
国家/地区
。正如Jimmy Bogard所说,Automapper的作者解释
如果您的配置不是95%的“自动”,不要使用它
这肯定不是要包含JSON解析逻辑。您可能应该反序列化
LocationInfo
属性的内容,并为该属性使用强类型对象。在必须将结果映射到新对象之前,延迟该步骤不会带来任何好处。