17

JSON.Netが逆シリアル化するオブジェクトをWeb APIが逆シリアル化できないのはどうしてですか?

Web API の試行をすべて null として表示する Visual Studio ですが、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 コントローラーを呼び出しています。Fiddler を使用して生の HTTP パケットをキャプチャし、それが正しいことを確認したため、同じ JSON がコントローラーに到達していることは確かであることに注意してください。

"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":""}}
4

2 に答える 2

23

クラス EditorSubmissionMainView および EditorSubmissionMainViewData から [Serializable] 属性を削除してみてください。

于 2012-10-11T16:46:48.073 に答える
0

問題は、jsonでの「data」または「id」の使用にあると思います。これはモデルバインダーを経由する必要があるため、デフォルトルートの「id」変数によって混乱する可能性があります。または、ペイロード自体を説明するためによく使用される一般的な用語「データ」によって混乱する可能性があります。

これらの名前を変更してみて、それで解決するかどうかをお知らせください。

于 2012-10-11T16:44:31.680 に答える