#c# #api #asp.net-core
#c# #API #asp.net-core
Вопрос:
У меня есть вызов объекта класса CustomerBase.cs с определенными свойствами. Он действует как базовый класс для двух других моих классов: Customer.cs и Vendor.cs. i.e
public class Customer: CustomerBase
public class Vendor: CustomerBase
У меня есть метод контроллера следующим образом:
[HttpPost("CustomerData")]
public async Task<CustomerBase> CustomerDataAsync(CustomerBase customerBaseParam)
{ }
Когда этот контроллер api вызывается другим веб-пользователем, параметр тела Json будет содержать $Type объекта rootobject. Он может содержать поставщика или клиента или просто базу клиентов. На данный момент, даже когда я передаю объект Vendor в качестве параметра, он сохраняет только свойства CustomerBase для параметра customerBaseParam. То же самое с объектом Customer, отправленным в качестве параметра. Как я могу изменить тип customerBaseParam на основе вводимого параметра тела Json.?
Я использую Newtonsoft.
Комментарии:
1. Ответ будет другим, если вы используете Newtonsoft. Json или System.Text.Json. Вам необходимо указать
2. Я использую Newtonsoft.Json
Ответ №1:
Вместо того, чтобы позволить MVC анализировать результат JSON за вас, возьмите JObject
и найдите поле, которое определяет, с каким типом объекта JSON вы имеете дело. Это позволит вам решить, к какому типу его отнести.
Примечание: Вы можете спроектировать это отдельно от промежуточного программного обеспечения MVC, чтобы оно было абстрагировано.
[HttpPost("CustomerData")]
public async Task<CustomerBase> CustomerDataAsync(JObject customerBaseJson)
{
var customerBaseIdentifier = customerBaseJson["fieldNameWithinTheJsonPayload"];
//This should really be a strategy pattern to adhere to the SOLID open close principle.
switch(customerBaseIdentifier) {
case "type 1":
var type1Object = JsonConvert.Deserialize<Type1>(customerBaseJson);
break;
case ...
}
}