Asp.net web api 在ASP.NET Web API中反序列化为派生类

Asp.net web api 在ASP.NET Web API中反序列化为派生类,asp.net-web-api,json.net,Asp.net Web Api,Json.net,,我询问如何修改Json.NET的序列化程序设置,ASP.NET Web API本机使用Json.NET进行(反)序列化。接受的答案工作得很好,例如,我能够将类型信息嵌入到序列化的JSON字符串中 但是,当我尝试将这个JSON字符串返回到一个Web API操作(该操作需要模型的父类)时,Web API仍然反序列化到父类,删除与子类对应的所有数据,并防止对子类进行强制转换和检测 class Entity { } class Person : Entity { } 一个简单的用例是在jQuery

,我询问如何修改Json.NET的序列化程序设置,ASP.NET Web API本机使用Json.NET进行(反)序列化。接受的答案工作得很好,例如,我能够将类型信息嵌入到序列化的JSON字符串中

但是,当我尝试将这个JSON字符串返回到一个Web API操作(该操作需要模型的父类)时,Web API仍然反序列化到父类,删除与子类对应的所有数据,并防止对子类进行强制转换和检测

class Entity { }
class Person : Entity { }

一个简单的用例是在jQuery中执行如下操作:

// get a serialized JSON Person
$.ajax({
    url : 'api/person'      // PersonController
}).success(function (m) {

    // then throw that Person right back via HTTP POST
    $.ajax({
        url : 'api/person',
        type : 'POST',
        data : m
    }).success(function (m) {
        console.log(m);     // false
    });

})
我希望通过修改Json.NET的
JsonSerializerSettings
来嵌入类型信息,它能够读取这些信息,并且至少可以尝试强制反序列化到该类型,但显然不能


我应该如何处理这样的问题?

Web API实际上不会“本机”进行任何(反)序列化。默认情况下,config.Formatters集合中包含了几个MediaTypeFormatters。您可以随意删除它们,并创建自己的MediaTypeFormatter,以您希望的方式处理序列化


MediaTypeFormatter确实不难创建。

实际上,第二个POST调用正在发送application/x-www-form-url编码的数据,这就是为什么JsonMediaTypeFormatter无法获取类型信息的原因。尝试将contentType设置为“application/json”

此外,第二个POST请求正文中的数据似乎已编码,需要在发送回服务之前对其进行解码

我能够让这个工作:

    // get a serialized JSON Person
    $.ajax({
        url: 'api/person'      // PersonController
    }).success(function (m) {

        // then throw that Person right back via HTTP POST
        $.ajax({
            url: 'api/person',
            type: 'POST',
            contentType: "application/json",
            data: JSON.stringify(m),
        }).success(function (m) {
            alert(m);     // true!
        });

    })

是的,我确实考虑过要推出一个习惯>代码> MediaTypeFormatter <代码>来处理这个任务,但是把它当作最后的手段。我一直在想,既然Web API默认使用Json.NET,那么可能会有一些东西需要调整/切换来实现上述功能,但显然没有那么容易。很酷,很好是的,数据是以
的身份输入的,但仍然是
实体
的一个实例。现在可以将其转换为
Person
(例如,现在将
实体转换为Person!==null
),但它仍然缺少自动获取
Person
的关键步骤。我可能不得不接受你答案中的信息,并在custom
MediaTypeFormatter
s.:-/非常感谢!
    // get a serialized JSON Person
    $.ajax({
        url: 'api/person'      // PersonController
    }).success(function (m) {

        // then throw that Person right back via HTTP POST
        $.ajax({
            url: 'api/person',
            type: 'POST',
            contentType: "application/json",
            data: JSON.stringify(m),
        }).success(function (m) {
            alert(m);     // true!
        });

    })