2010-04-02 5 views
2

Ce morceau de JSON valide (il a été généré en utilisant le json_encode de php):jQuery.parseJSON est-il en mesure de traiter tous les json valides?

{"html":"form is NOT valid<form id=\"articleform\" enctype=\"application\/x-www-form-urlencoded\" method=\"post\" action=\"\"><dl class=\"zend_form\">\n<dt id=\"title-label\">&nbsp;<\/dt>\n<dd id=\"title-element\">\n<input type=\"text\" name=\"title\" id=\"title\" value=\"Artikel K\"><\/dd>\n<dt id=\"articleFormSubmitted-label\">&nbsp;<\/dt>\n<dd id=\"articleFormSubmitted-element\">\n<input type=\"hidden\" name=\"articleFormSubmitted\" value=\"1\" id=\"articleFormSubmitted\"><\/dd>\n<dt id=\"submit-label\">&nbsp;<\/dt><dd id=\"submit-element\">\n<input type=\"submit\" name=\"submit\" id=\"submit\" value=\"Bewaar artikel\" onclick=\"this.value='Bezig...';\"><\/dd><\/dl><\/form><script type=\"text\/javascript\">\n\t $(\"#articleform\").submit(function(){\n $.post(\"\/admin\/ajax\/contenttree\/node\/9\/ajaxtarget\/ajaxContainer\", $(\"#articleform\").serialize(), function(html){$(\"#ajaxContainer\").html(html);});\n\t\t return false;\n\t });\n\n <\/script>","newNodeName":""} 

est de donner

jQuery.parseJSON(data) 

et moi un moment difficile.

Avec ce morceau de code:

alert('start'); 
alert(data); 
jQuery.parseJSON(data); 
alert('stop'); 

Je reçois un début de message et les données (jsonstring ci-dessus) est affiché. Le message "stop" n'apparaît jamais.

Quand j'utilise cette JSON:

{"html":"test","newNodeName":""} 

L'arrêt de message apparaît finalement.

$.ajax({ 
     url: "/admin/ajax/contenttree/node/" + (node.id).replace("node_", ""), 
     success: function(data){ 

     //this message appears 
     alert("succes"); 

     //this gives undefined 
     alert(data.html); 

     var result = $.parseJSON(data); 

     //this message never appears 
     alert("after parse"); 

     $("#ajaxContainer").html(result.html); 
     } 
    }); 

J'ai vérifié que mon premier gros morceau de json est valide. Pourquoi n'est-il pas traité par jQuery.parseJSON Y a-t-il des caractères spéciaux qui ne vont pas bien avec json?

+0

Comment ce json descend-il chez le client? –

+0

Via $ .ajax. La réponse ajax elle-même est le résultat d'un php-array qui est traité par php_encode. – murze

+0

Ne tirez pas sur moi, nous cherchons des erreurs, non? Il y a un point-virgule manquant après 'jQuery.parseJSON (data)' dans ce qui précède. Peu importe si elle est suivie d'une nouvelle ligne (comme c'est le cas dans votre texte cité) à cause de l'insertion de points-virgules et donc très probablement pas le problème, mais si (par exemple) le code que vous exécutez est minifié/compressé/emballé, ce serait un problème. Donc, juste mentionner. –

Répondre

2

J'ai trouvé la réponse à mon problème. Dans ma question, vous trouverez que j'ai essayé de passer le code HTML dans un tableau avec la clé html. Dans le code javascript j'ai essayé d'obtenir le code HTML en utilisant

jQuery.parseJSON(data); 
alert(data.html); 

Quand je le renomme htmlstring touche le parseJSON -fonction a bien fonctionné. Il n'y a plus besoin maintenant d'échapper à quoi que ce soit après la fonction php json_encode.

Je crois maintenant que .html est un mot réservé dans jQuery, donc si vous voulez utiliser parseJSON ne pas le nourrir un json avec une clé nommée "html".

3

Ce que vous avez posté est déjà JSON, pas besoin de l'analyser. Exemple:

var data = {"html":"form is NOT valid<form id=\"articleform\" enctype=\"application\/x-www-form-urlencoded\" method=\"post\" action=\"\"><dl class=\"zend_form\">\n<dt id=\"title-label\">&nbsp;<\/dt>\n<dd id=\"title-element\">\n<input type=\"text\" name=\"title\" id=\"title\" value=\"Artikel K\"><\/dd>\n<dt id=\"articleFormSubmitted-label\">&nbsp;<\/dt>\n<dd id=\"articleFormSubmitted-element\">\n<input type=\"hidden\" name=\"articleFormSubmitted\" value=\"1\" id=\"articleFormSubmitted\"><\/dd>\n<dt id=\"submit-label\">&nbsp;<\/dt><dd id=\"submit-element\">\n<input type=\"submit\" name=\"submit\" id=\"submit\" value=\"Bewaar artikel\" onclick=\"this.value='Bezig...';\"><\/dd><\/dl><\/form><script type=\"text\/javascript\">\n\t $(\"#articleform\").submit(function(){\n $.post(\"\/admin\/ajax\/contenttree\/node\/9\/ajaxtarget\/ajaxContainer\", $(\"#articleform\").serialize(), function(html){$(\"#ajaxContainer\").html(html);});\n\t\t return false;\n\t });\n\n <\/script>","newNodeName":""}; 

alert(data.html); 
alert(data.newNodeName); 

Ai-je manqué quelque chose d'autre morceau ?, laissez-moi savoir si je ne comprends pas correctement.

Mise à jour: Changez votre méthode ajax pour utiliser le support natif pour $.ajax ceci:

$.ajax({ 
     url: "/admin/ajax/contenttree/node/" + (node.id).replace("node_", ""), 
     dataType: 'json', 
     success: function(data){ 
     alert("succes"); 
     $("#ajaxContainer").html(data.html); 
     } 
    }); 
+0

L'alerte (data.html) donne "non défini" La variable de données est remplie par une réponse que je reçois du serveur, je crois que c'est juste une chaîne Si j'utilise "{" html ":" test "," newNodeName ":" "}" en tant qu'entrée pour la fonction parseJSON qu'après l'analyse de data.html est correctement rempli avec "test" – murze

+0

@murze - Vous devez faire 'data = jQuery.parseJSON (data);', est-ce le cas, ou littéralement ce qu'il y a dans la question? –

+0

J'ai ajouté un exemple dans ma question originale t o Rendre mon problème plus clair ... – murze

1

je recommande de commencer avec votre extrait qui fonctionne et puis ralentir l'ajout de texte en retrait des pièces qui n » t travaillez jusqu'à ce que vous trouviez quel bit cause des problèmes. Le JSON syntax est très, très simple, je serais surpris si jQuery avait des problèmes avec cela. Je m'interrogeais sur vos balises "script" et "function" (en pensant: "Je me demande si elles déclenchent une protection d'exploit ou quelque chose?") Mais une vérification rapide avec jQuery 1.4.1 dit que ce n'était pas ça.

Modifier

Le problème est ailleurs, les travaux suivants avec 1.4.1 ou 1.4.2 (ne fonctionnait pas avec 1.3.2, mais c'est parce que 1.3.2 n'a pas jQuery.parseJSON   — sent la tête). Parcourez votre code avec un débogueur et inspectez votre variable data pour voir ce qu'elle contient.

page de test:

<!DOCTYPE HTML> 
<html> 
<head> 
<meta http-equiv="Content-type" content="text/html;charset=UTF-8"> 
<title>Test Page</title> 
<style type='text/css'> 
body { 
    font-family: sans-serif; 
} 
</style> 
<script type='text/javascript' src='http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js'></script> 
<script type='text/javascript'> 
(function() { 
    $(document).ready(pageInit); 

    function pageInit() { 
     $('#btnGo').click(go); 
    } 

    function go() { 
     $.ajax({ 
      url: "test.json", 
      success: function(data) { 
       alert(data); 
       var obj = jQuery.parseJSON(data); 
       alert("obj.html = " + obj.html); 
      } 
     }); 
    } 
})(); 
</script> 
</head> 
<body><div> 
<input type='button' id='btnGo' value='Go'> 
</div></body> 
</html> 

test.json:

{"html":"form is NOT valid<form id=\"articleform\" enctype=\"application\/x-www-form-urlencoded\" method=\"post\" action=\"\"><dl class=\"zend_form\">\n<dt id=\"title-label\">&nbsp;<\/dt>\n<dd id=\"title-element\">\n<input type=\"text\" name=\"title\" id=\"title\" value=\"Artikel K\"><\/dd>\n<dt id=\"articleFormSubmitted-label\">&nbsp;<\/dt>\n<dd id=\"articleFormSubmitted-element\">\n<input type=\"hidden\" name=\"articleFormSubmitted\" value=\"1\" id=\"articleFormSubmitted\"><\/dd>\n<dt id=\"submit-label\">&nbsp;<\/dt><dd id=\"submit-element\">\n<input type=\"submit\" name=\"submit\" id=\"submit\" value=\"Bewaar artikel\" onclick=\"this.value='Bezig...';\"><\/dd><\/dl><\/form><script type=\"text\/javascript\">\n\t $(\"#articleform\").submit(function(){\n $.post(\"\/admin\/ajax\/contenttree\/node\/9\/ajaxtarget\/ajaxContainer\", $(\"#articleform\").serialize(), function(html){$(\"#ajaxContainer\").html(html);});\n\t\t return false;\n\t });\n\n <\/script>","newNodeName":""} 
0

Essayez avec:

alert('start'); 
data=data.replace('\','\\'); 
alert(data); 
test= jQuery.parseJSON(data); 
alert(test.html); 
alert('stop'); 

Il fonctionne pour moi.

0

J'ai trouvé la réponse au problème! Ou au moins l'origine du problème.

Le problème est dû aux caractères "<" et ">". Dès que j'essaie de transmettre ces caractères, la fonction parseJSON échoue.

Y a-t-il un moyen d'autoriser ces caractères?

J'ai déjà essayé d'ajouter header('Content-Type: text/html; charset=utf-8'); au code qui génère la réponse ajax.

+0

les échapper à > et <? – Mauro

+0

J'ai essayé cela, mais le morceau de html que j'essaie d'insérer dans la page est affiché littéralement et n'est pas traité comme html. – murze

+0

Les caractères < and > ne sont pas le problème, vérifiez ma réponse s'il vous plaît. – systempuntoout

Questions connexes