Как настроить десериализацию 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)


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

person John Mills    schedule 02.08.2010

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

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

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

person cRichter    schedule 09.07.2010