serialize newtonsoft net library jsonconvert c# asp.net-mvc asp.net-web-api json.net

c# - newtonsoft - jsonconvert vb net



¿Por qué la API web no deserializa esto pero JSON.Net lo hará? (2)

Creo que el problema puede ser el uso de "datos" o "id" en su json. Debido a que esto tiene que pasar por el cuaderno de modelos, puede confundirse con la variable "id" en la ruta predeterminada. O bien, puede confundirse con el término genérico "datos" que se usa a menudo para describir la carga útil en sí.

Intenta cambiar estos nombres y déjanos saber si eso lo resuelve.

¿Cómo puede la API web no deserializar un objeto que JSON.Net deserializa?

Este es el controlador de API web:

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. }

Este es el JSON, capturado por Fiddler y formateado:

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

Una clase de ejemplo que se serializa con JSON.Net pero no con un controlador de API web:

[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; } }

La API web utiliza JSON.Net, y no estoy usando ningún formateador JSON personalizado, solo estoy pasando el JSON a un controlador de API web. ¿Por qué esto no funciona?

EDITAR: Según lo solicitado, estoy llamando a mi controlador de API web con este Javascript (parte de JQuery DataTables). Tenga en cuenta que estoy seguro de que el mismo JSON está llegando a mi controlador independientemente porque capturé el paquete HTTP sin procesar con Fiddler y me aseguré de que sea correcto:

"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); } }); },

La solicitud HTTP sin procesar sigue:

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


Intente eliminar los atributos [Serializable] de sus clases EditorSubmissionMainView y EditorSubmissionMainViewData.