代码之家  ›  专栏  ›  技术社区  ›  John Mills

如何在ASP.NET MVC中自定义JSON的反序列化?

  •  1
  • John Mills  · 技术社区  · 15 年前

    我有一个通过JSON接收复杂对象的控制器操作。对象上有一个声明为抽象类型的属性。目前,action方法永远不会执行,因为当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 回复  |  直到 15 年前
        1
  •  1
  •   John Mills    15 年前

    最后,我编写了一个ActionFilter,它使用JSON.NET和一个自定义转换器来处理传入的JSON。自定义转换器非常聪明,可以使用JSON数据决定应该实例化哪些派生类。

        2
  •  0
  •   cRichter    15 年前

    否则,反序列化程序无法实例化对象。 没有其他人能帮你解决这个问题。 你有两种可能。

    要么从基类中删除抽象,