C# 反序列化自动映射中的动态对象?
我正在从第三方API获取一些数据。在响应中,我得到一个动态位置信息对象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
{
“国家代码3”:“SE”,
“国家名称”:“瑞典”,
“城市名称”:“马尔默”,
“纬度”:86.69,
“经度”:173.0551
}
现在我想获得country\u名称
,并使用AutoMapper将其映射到propertycountry
。为此,我想将上述动态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
属性的内容,并为该属性使用强类型对象。在必须将结果映射到新对象之前,延迟该步骤不会带来任何好处。