2010-11-11 8 views
1

Je fais une requête ajax en utilisant $ .get et comme résultat je pourrais obtenir une chaîne simple ou JSON, comment savoir si le résultat est JSON (objet) ou pas?comment savoir si le résultat d'une requête ajax est json?

EDIT:

puis-je retourner une chaîne et de transformer en quelque sorte dans l'objet/JSON?

+0

Ceci est vraiment plus un problème de contrat de données que toute autre chose. Les données que vous récupérez à partir d'un appel à $ .get doivent être fiables. –

+0

JSON * est une chaîne de caractères. – user113716

+0

@Patrick dw pas vraiment, quand je fais result.substr() et le résultat est un résultat json, j'obtiens erreur que substr n'est pas une fonction (donc c'est un objet) – Omu

Répondre

3

Utilisez la méthode typeof pour déterminer si elle est un objet ou une chaîne. Si vous souhaitez convertir une chaîne en un objet JSON et si vous approuvez la source, vous pouvez utiliser eval. Sinon, utilisez un analyseur JSON, tel que http://www.json.org/json_parse.js

+0

typeof (résultat) == 'objet' l'a fait – Omu

0

Vous devriez savoir. Chaque URL doit renvoyer uniquement un type de données.

+1

+1 Parce que c'est vrai. Une URL ne doit pas retourner "aléatoirement" un format de données. – RoToRa

+0

@RoToRa pourquoi pas? – Omu

+0

Parce que, dans ce cas par exemple, comment dites-vous la différence entre une chaîne qui contient JSON ou un objet JSON? –

2

Vous pouvez utiliser getJSON() au lieu

http://api.jquery.com/jQuery.getJSON/

Pour le modifier:

Vous pouvez utiliser

$.ajax({ 
     type: 'get', 
     cache: false, 
     url: service, 
     error: function(XMLHttpRequest, textStatus, errorThrown){ 
      failureFunction(XMLHttpRequest, textStatus, errorThrown); 
     }, 
     success: function(data){ 
      successFunction(data); 
     }, 
     dataType: 'text' 
    }); 

Avec dataType texte et analyser pour JSON à partir de là.

jQuery.parseJSON (JSON) - http://api.jquery.com/jQuery.parseJSON/

+0

ma demande peut retourner un contenu html simple ou json – Omu

0

Vous savez comment les données sont à venir et vous pouvez faire un chèque nul à

Comme

si elle est une chaîne construite JSON, faire Eval du résultat

IF(EmployeeDetails.SalaryDetails.lenght) 
{ 
    forloop() 
} 
+0

vous pouvez même vérifier dans le firebug le résultat, le dernier firebut dans le netpanel a un onglet json, si c'est vrai objet json il montre que la structure – kobe

5

Ce n'est pas 100% mais le serveur a probablement défini l'en-tête responce: Content-Type: application/json. Donc, vous pouvez essayer de le vérifier:

$.ajax({ 
    url: 'url', 
    success: function(data, textStatus, xhr){ 
    var spoiler = xhr.getResponseHeader('Content-Type'); 
    spoiler == 'application/json' ? alert('JSON received') : alert('Not JSON received'); 
    } 
}); 

Bien sûr, cela ne fonctionnait que si votre serveur règle correctement ses en-têtes.

Un moyen de plus: essayez de créer une fonction et de détecter les erreurs que vous pourriez avoir.

try { 
    x = (new Function('return ' + received_data))(); 
} 
catch (e) { 
    console.log('Its not a JSON data... or its invalid.'); 
} 
+1

Ceci est probablement la façon la plus conforme aux normes de traiter la négociation de contenu. – vaskin

3

Habituellement, vous attendez de savoir ce que le type de données est, mais si pour une raison quelconque, vous ne le faites pas, que diriez-vous de vérifier en-tête du « Content-Type ». En théorie, il devrait être « application/json »:

function responseHandler() { 
    if (http_request.readyState == 4) { 
     if (http_request.status == 200) { 
      if(http_request.getResponseHeader("Content-Type") == 'application/json') { 
       // JSON 
      } 
      else { 
       // Not JSON 
      } 
     } 
    } 
} 

Bien sûr, vous devrez vérifier que le serveur met l'en-tête Content-Type correctement. En outre, je ne sais pas si cela fonctionnera dans IE, probablement pas.

Questions connexes