Может ли jQuery.parseJSON обработать все допустимые файлы json? - PullRequest
2 голосов
/ 02 апреля 2010

Этот фрагмент действительного json (он был сгенерирован с использованием json_encode php):

{"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":""}

дает

jQuery.parseJSON(data)

и мне тяжело.

С этим куском кода:

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

Я получаю сообщение начала, а затем отображаются данные (jsonstring выше). Сообщение «стоп» никогда не появляется.

Когда я использую этот JSON:

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

В конце концов появляется сообщение об остановке.

$.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);
      }
    });

Я подтвердил, что мой первый большой кусок json действителен. Почему не обрабатывается jQuery.parseJSON Есть ли какие-нибудь специальные символы, которые не подходят для json?

Ответы [ 5 ]

3 голосов
/ 02 апреля 2010

То, что вы опубликовали, уже является JSON, нет необходимости анализировать его. Пример:

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);

Я что-то упускаю из другой части? Дайте мне знать, если я не правильно понимаю.

Обновление: Измените метод ajax, чтобы использовать встроенную поддержку $.ajax для этого:

$.ajax({
      url: "/admin/ajax/contenttree/node/" + (node.id).replace("node_", ""),
      dataType: 'json',
      success: function(data){
        alert("succes");
        $("#ajaxContainer").html(data.html);
      }
    });
2 голосов
/ 06 апреля 2010

Я нашел ответ на мою проблему. В моем вопросе вы обнаружите, что я пытался передать html внутри массива с ключом html. В javascript-коде я попытался получить HTML, используя

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

Когда я переименовал ключ htmlstring, функция parseJSON работала нормально. Теперь нет необходимости что-либо экранировать после того, как php-функция json_encode выполнит свою работу.

Теперь я считаю, что .html - это зарезервированное слово в jQuery, поэтому, если вы хотите использовать parseJSON, не передавайте ему json с ключом с именем "html".

1 голос
/ 02 апреля 2010

Я бы порекомендовал начать с вашей выдержки, которая работает, а затем замедлить добавление обратно текста из частей, которые не работают, пока вы не выясните, какой бит вызывает проблемы. Синтаксис JSON очень и очень прост, я был бы удивлен, если бы у jQuery были с этим проблемы.

Я задавался вопросом о ваших тегах "script" и о "функции" (думая: "Интересно, они вызывают защиту от эксплойтов или что-то в этом роде?"), Но быстрая проверка с помощью jQuery 1.4.1 показала, что это не так. 1005 *

Редактировать

Проблема в другом месте, следующее работает с 1.4.1 или 1.4.2 (не работало с 1.3.2, но это потому, что 1.3.2 не имеет jQuery.parseJSON & ndash; smacks head). Пройдите по коду с помощью отладчика и проверьте переменную data, чтобы увидеть, что она содержит.

Тестовая страница:

<!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 голосов
/ 02 апреля 2010

Я нашел ответ на проблему! Или, по крайней мере, происхождение проблемы.

Проблема вызвана символами «<» и «>». Как только я пытаюсь передать эти символы, функция parseJSON перестает работать.

Есть ли способ разрешить эти символы?

Я уже пытался добавить header('Content-Type: text/html; charset=utf-8'); в код, генерирующий ajax-ответ.

0 голосов
/ 02 апреля 2010

Попробуйте с:

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

Это работает для меня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...