Десериализовать динамический объект в automapper?

Я получаю данные из стороннего API. В ответ я получаю динамический объект location_info

{
  "country_code3": "SE",
  "country_name": "Sweden",
  "city_name": "Malmo",
  "latitude": 86.69,
  "longitude": 173.0551
}

Теперь я хочу получить country_name и сопоставить его со свойством Country с помощью AutoMapper. Для этого я хочу десериализовать вышеупомянутый динамический JSON в модель LocationInfo:

public class LocationInfo
{
    public string Country_Name { get; set; }
}

Затем AutoMapper сопоставит Country_Name с Country. Вот что я пробовал:

.ForMember(dest => dest.Country, opts => opts.MapFrom(src => JsonConvert.DeserializeObject<LocationInfo>(src.LocationInfo).Country_Name); 

Но это не сработало, и я получил следующее исключение:

An expression tree may not contain a dynamic operation.

Общее практическое правило - не использовать AutoMapper, если большинство (или все) свойств не могут быть сопоставлены по соглашению, поскольку это упускает из виду, что он является «автоматическим».

Tseng 10.09.2018 09:33

Похоже, ваш API возвращает ответ JSON. Я настоятельно рекомендую использовать Json.Net и использовать [JsonProperty("country_name")] на Country вашей модели.

jegtugado 10.09.2018 09:46
docs.automapper.org/en/latest/…
Lucian Bargaoanu 10.09.2018 10:03

Как объясняет Джимми Богард, автор Automapper if your config isn't 95% "Auto", dont use ittwitter.com/jbogard/status/1038041038496124928 Это определенно нет, предназначенный для включения логики синтаксического анализа JSON.

Panagiotis Kanavos 10.09.2018 11:16

Вероятно, вам следует десериализовать содержимое свойства LocationInfo и использовать строго типизированный объект для этого свойства. Вы ничего не получите, откладывая этот шаг до тех пор, пока вам не придется сопоставить результат с новым объектом.

Panagiotis Kanavos 10.09.2018 11:19
0
5
821
1

Ответы 1

Вы можете использовать метод ResolveUsing, когда вам нужно выполнить некоторые методы внутри сопоставления. Для вашего случая это будет:

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

Другие вопросы по теме