2010-01-21 4 views
5

J'utilise jQuery.ajax (...) pour extraire des données JSON d'un service ASP.NET MVC. Lorsque le serveur rencontre une exception, je vous envoie 400 Bad état de demande au client et envoie mon exception comme JsonResult:Comment jQuery désérialise-t-il JSON?

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

Et voici mon code 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); 
    } 
}); 

Mon ASP.NET le code m'envoie à la section d'erreur de mon code JavaScript, et le bloc d'erreur me permet seulement de lire le request.responseText au lieu de travailler avec les objets renvoyés par le serveur. Maintenant, au lieu d'ajouter encore un autre JavaScript à quelque chose comme json_parse et de désérialiser simplement mon Exception, je voudrais simplement tirer parti du même analyseur JSON que jQuery utilise, bien que je ne trouve pas facilement de trouver des informations là-dessus .

Quelqu'un peut-il me diriger dans la bonne direction?

+0

J'ai trouvé un poste (http://www.west-wind.com/weblog/posts/324917.aspx) sur le blog de Rick Strahl qui explique: "Notez que la fonction ajaxJSON nécessite un codage JSON jQuery ne possède aucune fonctionnalité de codage JSON natif (ce qui semble une grande omission, mais a probablement été fait pour préserver le faible encombrement.) Cependant, un certain nombre d'implémentations JSON sont disponibles. Ci-dessus, j'utilise le fichier JSON2.js de Douglas Crockford pour sérialiser le mappage des objets de paramètres dans JSON. " Je pensais que j'avais lu cela changé dans jQuery 1.4 ... –

+2

ce qui a changé était jQuery utilisera maintenant 'JSON.parse' au lieu de' eval' s'il est disponible. jQuery n'a jamais fourni (et ne fournit toujours pas) le support OOTB pour la sérialisation JSON *. –

+0

@Crescent, cela devrait être donné comme une réponse, pas un commentaire. – Cheeso

Répondre

6

jQuery utilisé pour utiliser eval, si je ne me trompe pas. Depuis 1.4, il profite du désérialiseur JSON natif s'il y en a (il y en a un dans Firefox, par exemple)

+0

Quelqu'un sait si jQuery a exposé une méthode pratique pour cela? –

+5

@Peder: oui, 'jQuery.httpData (request," json ")' vous rendra votre objet JSON/JavaScript analysé. –

+0

En fait, vous n'avez pas besoin de spécifier "json"; httpData sera par défaut à cela. – kgriffs

2

Je pense en javascript si vous avez une chaîne json vous pouvez utiliser eval pour obtenir un objet, ie:

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

il y a plus d'informations à ce sujet sur http://www.json.org/js.html

+0

Pas le moyen le plus sûr d'analyser les données. –

+0

En fait, je reprends ce que j'ai dit. Puisque dans ce cas je ne ramène que des données "sûres" et non des données fournies par l'utilisateur, je peux désérialiser en toute sécurité les données de requête en utilisant eval. –

+0

Dans la fonction d'erreur '$ .ajax', vous pouvez utiliser:' function (xhr) {json = eval ('(' + xhr.responseText + ')'); ...}; ' – Natim

0

peut-être que cela pourrait vous aider. Je l'utilise pour supprimer les commentaires et les espaces dans mon JSON:

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

Les commentaires ne sont pas légaux JSON quand même. Pourquoi sont-ils renvoyés dans votre réponse? –