Как я могу настроить десериализацию JSON в ASP.NET MVC? - PullRequest
1 голос
/ 09 июля 2010

У меня есть действие контроллера, которое получает сложный объект через 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
      });

Ответы [ 2 ]

1 голос
/ 02 августа 2010

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

0 голосов
/ 09 июля 2010

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

либо удалить реферат из базового класса,

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...