【发布时间】:2012-10-02 09:04:25
【问题描述】:
Web API 如何无法反序列化 JSON.Net 反序列化的对象?
这是 Web 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<EditorSubmissionMainView>(json) as EditorSubmissionMainView;
// foo is a EditorSubmissionMainView but properly deserialized.
}
这是 Fiddler 捕获并格式化的 JSON:
{
"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<Dictionary<string, int?>> equipment { get; set; }
[JsonProperty("NOTES")]
public string notes { get; set; }
}
Web API 使用 JSON.Net,我没有使用任何自定义 JSON 格式化程序——只是将 JSON 传递给 Web API 控制器。为什么这不起作用?
编辑: 根据要求,我正在使用这个 Javascript(JQuery DataTables 的一部分)调用我的 Web API 控制器。请注意,我确信相同的 JSON 会到达我的控制器,因为我已经使用 Fiddler 捕获了原始 HTTP 数据包并确保它是正确的:
"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":""}}
【问题讨论】:
-
请发布您如何调用您的 webapi 方法(js ajax 代码)!
-
确保您的请求具有
Content-Type: application/json标头 -
WebAPI 返回什么?
-
@MerickOWA:在控制器中,
ajaxSubmission显示为具有所有属性的EditorSubmissionMainView,但它们都是null。 -
@marcind:我以前肯定遇到过这个问题!在这种情况下,虽然我只是发布了内容类型确实正确的原始 HTTP 请求。
标签: c# asp.net-mvc asp.net-web-api json.net