为什么不会的Web API反序列化这一点,但JSON.Net会? [英] Why won't Web API deserialize this but JSON.Net will?

查看:171
本文介绍了为什么不会的Web API反序列化这一点,但JSON.Net会?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

网页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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆