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.