2010-01-21 16 views
5

Estoy usando jQuery.ajax (...) para recuperar datos JSON de un servicio ASP.NET MVC. Cuando el servidor encuentra una excepción, le envío un estatus Bad Request 400 de vuelta al cliente y Envío de excepción como JsonResult:¿Cómo deserializa jQuery JSON?

Response.StatusCode = 400; 
return Json(new { ex.Message, ex.StackTrace }); 

y aquí está mi código jQuery:

$.ajax(
{ 
    type: "POST", 
    url: deleteUrl, 
    dataType: "json", 
    data: 
    { 
     dataItems: dataItems, 
     toJSON: true 
    }, 
    success: function(msg) 
    { 
     alert(msg[i].dataItem); 
    }, 
    error: function(request, status, error) 
    { 
     alert(request.responseText); 
    } 
}); 

Mi ASP.NET el código me envía a la sección de error de mi código JavaScript, y el bloque de error solo me permite leer el request.responseText en lugar de trabajar con los objetos devueltos por el servidor.

Ahora, en lugar de agregar otro JavaScript más para incluir algo como json_parse y simplemente deserializar mi Excepción, me gustaría simplemente aprovechar el mismo analizador JSON que utiliza jQuery, aunque no puedo encontrar fácilmente información sobre él .

¿Puede alguien señalarme en la dirección correcta?

+0

me encontré con un post (http://www.west-wind.com/weblog/posts/324917.aspx) en el blog de Rick Strahl que explica: "Tenga en cuenta que la función ajaxJSON requiere codificación JSON. JQuery no tiene ninguna funcionalidad de codificación JSON nativa (lo que parece una gran omisión, pero probablemente se hizo para conservar el tamaño pequeño). Sin embargo, hay varias implementaciones JSON disponibles. Arriba, estoy usando el archivo JSON2.js de Douglas Crockford para serializar el mapa de objetos de parámetros en JSON ". Pensé que había leído esto cambiado en jQuery 1.4 ... –

+2

qué fue lo que cambió jQuery ahora usará 'JSON.parse' en lugar de' eval' si está disponible. jQuery nunca proporcionó (y aún no proporciona) compatibilidad con OOTB para la serialización JSON *. –

+0

@Crescent, eso se debe dar como una respuesta, no como un comentario. – Cheeso

Respuesta

6

jQuery solía usar eval, si no me equivoco. Desde 1.4, aprovecha el deserializador JSON nativo si hay alguno (hay uno en Firefox, por ejemplo)

+0

¿Alguien sabe si jQuery expuso un método útil para esto? –

+5

@Peder: sí, 'jQuery.httpData (request," json ")' le devolverá su objeto JSON/JavaScript analizado. –

+0

En realidad, no tiene que especificar "json"; httpData se ajustará a eso de manera predeterminada. – kgriffs

2

Creo que en javascript si tienes una cadena json puedes usar eval para obtener un objeto, es decir:

var myObject = eval('(' + myJSONtext + ')'); 

hay más información sobre esto en http://www.json.org/js.html

+0

No es la forma más segura de analizar datos. –

+0

En realidad, recupero lo que dije. Dado que en este caso solo estoy trayendo datos "seguros" y no datos proporcionados por el usuario, puedo deserializar de forma segura los datos de solicitud utilizando eval. –

+0

En la función de error '$ .ajax', puede usar:' function (xhr) {json = eval ('(' + xhr.responseText + ')'); ...}; ' – Natim

0

Tal vez esto podría ayudarle. Yo lo uso para borrar los comentarios y espacios en mi JSON:

json = eval(o.responseText 
    .replace(/\/\*(.*)\*\/g, ' ') 
    .replace(/([^\:])\/\/[^\n]*\n/g, '$1') 
    .replace(/^\s|\s+|\s$/g, '')) 
+0

Los comentarios no son legales JSON de todos modos. ¿Por qué están siendo devueltos en tu respuesta? –