jQuery.parseJSON能够处理所有有效的json吗?

时间:2010-04-02 12:32:45

标签: jquery json

这段有效的json(它是使用php的json_encode生成的):

{"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 个答案:

答案 0 :(得分:3)

您发布的内容已经是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);
      }
    });

答案 1 :(得分:2)

我找到了问题的答案。在我的问题中,你会发现我试图用密钥html在一个数组中传递html。在javascript代码中,我尝试使用

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

当我重命名密钥htmlstring时,parseJSON - 功能正常。现在没有必要在php函数json_encode完成它之后逃脱任何事情了。

我现在相信.html是jQuery中的保留字,所以如果你想使用parseJSON,请不要用名为“html”的密钥为json提供它。

答案 2 :(得分:1)

我建议从你的摘录开始,然后减慢从不起作用的部分添加文本,直到你发现哪个位造成麻烦。 JSON syntax非常非常简单,如果jQuery遇到问题,我会感到惊讶。

我想知道你的“脚本”标签和“功能”(思考:“我想知道这些是否会触发漏洞利用保护?”)但是使用jQuery 1.4.1进行快速检查说不是。< / p>

修改

问题出在其他地方,下面的工作与1.4.1或1.4.2(不适用于1.3.2,但那是因为1.3.2没有jQuery.parseJSON - 咂头)。使用调试器浏览代码并检查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":""}

答案 3 :(得分:0)

尝试:

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

它对我有用。

答案 4 :(得分:0)

我找到了问题的答案!或者至少是问题的根源。

问题是由“&lt;”引起的和“&gt;”字符。一旦我尝试传递这些字符,parseJSON函数就会失败。

有没有办法允许这些角色?

我已经尝试将header('Content-Type: text/html; charset=utf-8');添加到生成ajax-response的代码中。