Почему Web API не десериализует это, а JSON.Net будет?

Как Web API может не десериализовать объект, который десериализует JSON.Net?

Это контроллер веб-API:

public void Put(EditorSubmissionMainView ajaxSubmission) {
// ajaxSubmission: EditorSubmissionMainView with all values ('data' also == null)

    string json = "{\"id\":\"row_1377\",\"data\":{\"ROTATION\":\"1\",\"EQUIPMENT\":[{\"id\":\"6\"},{\"id\":\"8\"}],\"NOTES\":\"\"}}";

    EditorSubmissionMainView foo = Newtonsoft.Json.JsonConvert.DeserializeObject(json) as EditorSubmissionMainView;
// foo is a EditorSubmissionMainView but properly deserialized.
}

Это JSON, захваченный Fiddler и отформатированный:

{
    "id": "row_1377",
    "data": {
        "ROTATION": "1",
        "EQUIPMENT": [{
            "id": "6"
        },
        {
            "id": "8"
        }],
        "NOTES": ""
    }
}

Пример класса, который сериализуется с JSON.Net, но не с контроллером Web API:

[Serializable]
public class EditorSubmissionMainView
{
    public string id { get; set; }
    public EditorSubmissionMainViewData data { get; set; }
}

[Serializable]
public class EditorSubmissionMainViewData
{
    [JsonProperty("ROTATION")]
    public int? rotation { get; set; } // Same problem if everything is a string

    [JsonProperty("EQUIPMENT")]
    public ICollection equipment { get; set; }

    [JsonProperty("NOTES")]
    public string notes { get; set; }
}

Web API использует JSON.Net, и я не использую никаких пользовательских форматеров JSON - просто передаю JSON в контроллер Web API. Почему это не работает?

РЕДАКТИРОВАТЬ: В соответствии с просьбой, я вызываю мой контроллер веб-API с этим Javascript (часть JQuery DataTables). Обратите внимание, что я уверен, что тот же JSON попадает в мой контроллер независимо от того,мы перехватили необработанный HTTP-пакет с помощью Fiddler и убедились, что он правильный:

"ajaxUrl": {
    "create": "POST @Url.Content("~/API/MainView")",
    "edit":   "PUT @Url.Content("~/API/MainView")",
    "remove": "DELETE @Url.Content("~/API/MainView")"
},

"ajax": function (method, url, data, successCallback, errorCallback) {
    $.ajax({
        "type": method,
        "url": url,
        "data": JSON.stringify(data), // Requires IE8+
        "contentType": "application/json",
        "dataType": "json",
        "success": function (json) {
            successCallback(json);
        },
        "error": function (xhr, error, thrown) {
            errorCallback(xhr, error, thrown);
        }
    });
},

Необработанный HTTP-запрос выглядит следующим образом:

PUT http://localhost:53367/API/MainView HTTP/1.1
x-requested-with: XMLHttpRequest
Accept-Language: en-us
Referer: http://localhost:53367/Manage/MainView
Accept: application/json, text/javascript, */*; q=0.01
Content-Type: application/json
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)
Host: localhost:53367
Content-Length: 306
Connection: Keep-Alive
Pragma: no-cache
Cookie: ASP.NET_SessionId=wqsghjrol20cszrxfzdm0qo4

{"id":"row_1377","data":{"ROTATION":"1","EQUIPMENT":[{"id":"6"},{"id":"8"}],"NOTES":""}}
 Charles Burns11 окт. 2012 г., 18:30
@nemesv: Готово. :)
 marcind11 окт. 2012 г., 18:30
Убедитесь, что ваш запрос имеетContent-Type: application/json заголовок
 MerickOWA11 окт. 2012 г., 18:31
Что возвращает WebAPI?
 nemesv11 окт. 2012 г., 18:25
Пожалуйста, опубликуйте, как вы называете свой метод webapi (код js ajax)!
 Charles Burns11 окт. 2012 г., 18:42
@marcind: ямы наверняка сталкивались с этой проблемой раньше! В этом случае я только что опубликовал необработанный HTTP-запрос, в котором тип содержимого действительно правильный.
 Charles Burns11 окт. 2012 г., 18:33
@MerickOWA: в контроллереajaxSubmission показывает какEditorSubmissionMainView со всеми его атрибутами, но все они есть.null

Ответы на вопрос(2)

Решение Вопроса

issionMainView и EditorSubmissionMainViewData.

 Maggie Ying11 окт. 2012 г., 19:56
Сериализатор Json.NET по умолчанию устанавливает для атрибута IgnoreSerializableAttribute значение true. В WebAPI мы устанавливаем это значение false. Причина, по которой вы решили эту проблему, заключается в том, что Json.NET игнорирует свойства: "Json.NET теперь обнаруживает типы, имеющие атрибут SerializableAttribute, и сериализует все поля этого типа, как публичные, так и частные, и игнорирует свойства ». (цитата изjames.newtonking.com/archive/2012/04/11/...)
 Javier04 янв. 2014 г., 00:11
Проверьте мой вопрос, чтобы заставить JSON.NET и [Serializable] работать вместе:stackoverflow.com/questions/20914080/...
 amcdnl03 дек. 2013 г., 17:10
@Maggie Ying - есть идеи по этому вопросу:stackoverflow.com/questions/20252027/...
 Charles Burns11 окт. 2012 г., 19:00
Это решило проблему. Контроллер теперь десериализует объект. WTH? :) Как ни странно я добавил[Serializable] в тщетной попытке решить более раннюю проблему. Я до сих пор неНе понятно, почему JSON.Net может десериализоваться при непосредственном использовании, потому что объект все еще помечен[Serializable], Странный!

данные" или же "Я бы" в вашем JSON. Поскольку это должно проходить через связующее звено модели, оно может быть запутано "Я бы" переменная в маршруте по умолчанию. Или это может быть запутанным общим термином "данные" тот's часто используется для описания самой полезной нагрузки.

Попробуйте изменить эти имена и дайте нам знать, если это решит это.

Ваш ответ на вопрос