Как настроить десериализацию JSON в ASP.NET MVC?

У меня есть действие контроллера, которое получает сложный объект через JSON. Объект имеет свойство, объявленное как абстрактный тип. В настоящее время метод действия никогда не выполняется, потому что при десериализации объекта JSON он подавляется абстрактным типом.

Как настроить фазу десериализации, чтобы предоставить десериализатору правильные конкретные типы?

public class ComplexType
{
    public AbstractClass AbstractObject { get; set; }
}

public abstract class AbstractClass
{
}

public class ConcreteClass1 : AbstractClass
{
}

public class ConcreteClass2 : AbstractClass
{
}

[AcceptVerbs(HttpVerbs.Post)]
public JsonResult MyAction(ComplexType complexObject)
{

    // code ...

    return Json(myResult);
}

Вызывается с:

   $.ajax({
      url: myUrl,
      data: JSON.stringify(instanceOfComplexType),
      cache: false,
      contentType: "application/json",
      complete: function (data, textStatus) {
        // handle response
      },
      dataType: "json",
      type: "POST",
      processData: false
      });

person John Mills    schedule 09.07.2010    source источник
comment
Не могли бы вы добавить фрагмент кода, где вы отправляете данные в действие MyAction?   -  person Oleg    schedule 09.07.2010


Ответы (2)


arrow_upward
1
arrow_downward

В конце концов я написал ActionFilter, который обрабатывает входящий JSON, используя JSON.NET и пользовательский конвертер. Пользовательский преобразователь достаточно умен, чтобы решить, используя данные JSON, какой из моих производных классов он должен создавать.

person John Mills    schedule 02.08.2010

arrow_upward
0
arrow_downward

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

либо удалить аннотацию из базового класса,

или сделать реализацию сложного типа, которая реализует конкретное свойство AbstractObject (возможно, с помощью контравариантности или дженериков)

person cRichter    schedule 09.07.2010