为什么不会的Web API反序列化这一点,但JSON.Net会? [英] Why won't Web API deserialize this but JSON.Net will?
问题描述
网页API怎能不反序列化对象JSON.Net反序列化?
这是Web API控制器:
公共无效将(EditorSubmissionMainView ajaxSubmission){
// ajaxSubmission:EditorSubmissionMainView所有值(数据也== NULL) JSON字符串= \"{\\\"id\\\":\\\"row_1377\\\",\\\"data\\\":{\\\"ROTATION\\\":\\\"1\\\",\\\"EQUIPMENT\\\":[{\\\"id\\\":\\\"6\\\"},{\\\"id\\\":\\\"8\\\"}],\\\"NOTES\\\":\\\"\\\"}}\"; EditorSubmissionMainView富= Newtonsoft.Json.JsonConvert.DeserializeObject< EditorSubmissionMainView>(JSON)作为EditorSubmissionMainView;
// foo是一个EditorSubmissionMainView但正确反序列化。
}
这是JSON,由小提琴手捕获和格式化的:
{
ID:row_1377
数据:{
旋转:1,
装备:[{
ID:6
},
{
ID:8
}],
注意:
}
}
这与JSON.Net但不与Web API控制器序列化的一个示例类:
[Serializable接口]
公共类EditorSubmissionMainView
{
公共字符串ID {搞定;组; }
公共EditorSubmissionMainViewData数据{搞定;组; }
}[Serializable接口]
公共类EditorSubmissionMainViewData
{
[JsonProperty(旋转)]
公众诠释?旋转{搞定;组; } //同样的问题,如果一切是一个字符串 [JsonProperty(设备)]
公众的ICollection<&字典LT;字符串,整数>>设备{搞定;组; } [JsonProperty(「票据」)]
公共字符串笔记{搞定;组; }
}
网络API使用JSON.Net,而我没有使用任何自定义JSON格式程序 - 刚好路过的JSON到一个Web API控制器。这是为什么不工作?
编辑:
按照要求,我打电话与此Javascript(JQuery的数据表的一部分),我的Web API控制器。请注意,我相信同样的JSON越来越为我的控制器不管,因为我已经抓获提琴手原始HTTP数据包,并确保它是正确的:
ajaxUrl:{
创造:POST @ Url.Content(〜/ API /的MainView),
编辑:PUT @ Url.Content(〜/ API /的MainView),
删除:DELETE @ Url.Content(〜/ API /的MainView)
},Ajax的:功能(方法,URL,数据,successCallback,errorCallback){
$阿贾克斯({
类型:方法,
URL:URL,
数据:JSON.stringify(数据),//需要IE8 +
的contentType:应用/ JSON
数据类型:JSON
成功:功能(JSON){
successCallback(JSON);
},
错误:功能(XHR,错误抛出){
errorCallback(XHR,错误抛出);
}
});
},
原始的HTTP请求如下:
PUT HTTP://本地主机:53367 / API /的MainView HTTP / 1.1
的x要求,具有:XMLHtt prequest
接受语言:EN-US
引用者:HTTP://本地主机:53367 /管理/的MainView
接受:应用/ JSON,文本/ javascript中,* / *; Q = 0.01
内容类型:应用程序/ JSON
接受编码:gzip,紧缩
用户代理:Mozilla的/ 5.0(兼容; MSIE 9.0; Windows NT的6.1; WOW64;三叉戟/ 5.0)
主机:本地主机:53367
内容长度:306
连接:保持活动
编译:无缓存
饼干:ASP.NET_SessionId = wqsghjrol20cszrxfzdm0qo4{ID:row_1377,数据:{旋转:1,装备:[{ID:6},{ID:8}],NOTES :}}
尝试删除[Serializable接口]从你的类EditorSubmissionMainView和EditorSubmissionMainViewData属性。
How can Web API fail to deserialize an object that JSON.Net deserializes?
This is the Web API controller:
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.
}
This is the JSON, captured by Fiddler and formatted:
{
"id": "row_1377",
"data": {
"ROTATION": "1",
"EQUIPMENT": [{
"id": "6"
},
{
"id": "8"
}],
"NOTES": ""
}
}
An example class that serializes with JSON.Net but not with a Web API controller:
[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 uses JSON.Net, and I am not using any custom JSON formatters -- just passing the JSON to a Web API controller. Why is this not working?
EDIT: As requested, I am calling my Web API controller with this Javascript (part of JQuery DataTables). Note that I am certain the same JSON is getting to my controller regardless because I've captured the raw HTTP packet with Fiddler and ensured that it is correct:
"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);
}
});
},
The raw HTTP request follows:
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":""}}
Try removing the [Serializable] attributes from your classes EditorSubmissionMainView and EditorSubmissionMainViewData.
这篇关于为什么不会的Web API反序列化这一点,但JSON.Net会?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!