2

在我的最后一个 SO 问题中,我询问了如何修改 Json.NET 的序列化程序设置,ASP.NET Web API 本身用于(反)序列化。接受的答案非常有效,例如,我能够将类型信息嵌入到序列化的 JSON 字符串中。

但是,当我尝试将此 JSON 字符串返回到期望模型的父类的 Web API 操作时,Web API 仍会反序列化为父类,删除与子类对应的所有数据,并阻止对子类的转换和检测班级。

class Entity { }
class Person : Entity { }

public Person Get() {
    return new Person();
}

public bool Post(Entity entity) {
    return entity is Person;
}

一个简单的用例是在 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
    });

})

我希望通过修改JsonSerializerSettingsJson.NET 以嵌入它能够读取的类型信息,并且至少尝试强制反序列化为该类型,但显然它没有。

我应该如何处理这样的事情?

4

2 回答 2

1

实际上,第二个 POST 调用正在发送 application/x-www-form-urlencoded 数据,这就是 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!
        });

    })
于 2012-11-09T16:59:21.050 回答
1

Web API really doesn't do any (de)serialization "natively". It happens to have a few MediaTypeFormatters included in the config.Formatters collection by default. Feel free to remove those and create your own MediaTypeFormatter that handles the serialization the way you want it to be done.

MediaTypeFormatters are really not that hard to create.

于 2012-11-09T15:09:07.097 回答