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

jQuery.parseJSON是否能够处理所有有效的json?,jquery,json,Jquery,Json,这段有效的json(它是使用php的json_encode生成的): 我也很难过 使用这段代码: alert('start'); alert(data); jQuery.parseJSON(data); alert('stop'); 我得到一条消息start,然后显示数据(上面的jsonstring)。“停止”消息从未出现 当我使用这个json时: {"html":"test","newNodeName":""} 消息stop最终出现 $.ajax({ url: "/admin/

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

我也很难过

使用这段代码:

alert('start');
alert(data);
jQuery.parseJSON(data);
alert('stop');
我得到一条消息start,然后显示数据(上面的jsonstring)。“停止”消息从未出现

当我使用这个json时:

{"html":"test","newNodeName":""}
消息stop最终出现

$.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不匹配的特殊字符?

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

我建议你从你的摘录开始,然后慢慢地从那些不起作用的部分加回文本,直到你发现是哪个部分引起了麻烦。问题非常非常简单,如果jQuery有问题,我会感到惊讶

我想知道您的“脚本”标记和“函数”(想:“我想知道这些是否触发了漏洞保护或其他什么?”)但通过jQuery 1.4.1快速检查后发现不是这样

编辑

问题出在其他地方,以下内容适用于1.4.1或1.4.2(不适用于1.3.2,但这是因为1.3.2没有
jQuery.parseJSON
-smacks head)。使用调试器浏览代码并检查
数据
变量以查看它包含的内容

测试页面:

<!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>

测试页
身体{
字体系列:无衬线;
}
(功能(){
$(文档).ready(pageInit);
函数pageInit(){
$('btnGo')。单击(go);
}
函数go(){
$.ajax({
url:“test.json”,
成功:功能(数据){
警报(数据);
var obj=jQuery.parseJSON(数据);
警报(“obj.html=“+obj.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":""}
{“html”:“表单无效\n\n\n\n\n\n\n\t$(\“\35; articleform\”).submit(函数(){\n$.post(\“\/admin\/ajax\/contenttree\/node\/9\/ajaxtarget\/ajaxContainer\”,$(\“\35; articleform\”)).serialize(),函数(html){($(\”)(\“\35; ajaxContainer\”).html(html);\n\t\t\t返回false;\n\n\newt\”;\node“:”
试试:

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

它对我有用。

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

该问题是由“”字符引起的。只要我尝试传递这些字符,parseJSON函数就会失败

有没有办法允许这些字符


我已经尝试添加
标题('Content-Type:text/html;charset=utf-8')到生成ajax响应的代码。

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

jQuery.parseJSON(data);
alert(data.html);
当我重命名key
htmlstring
时,
parseJSON
-函数运行良好。在php函数json_encode完成任务后,现在不再需要转义任何内容


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

这个json是如何传递给客户端的?通过$.ajax。ajax响应本身是php_encode处理的php数组的结果?上面的
jQuery.parseJSON(data)
之后缺少分号。因为分号的插入,所以后面是否跟一个换行符(就像在引用的文本中一样)并不重要,因此不太可能是问题所在,但是如果(例如)您实际运行的代码正在被缩小/压缩/打包,这将是一个问题。所以,仅提一下。上面的示例中确实缺少分号(我现在已经更正了)。在我在服务器上的代码中,分号就在那里。如图所示,您正试图解析一个对象。JSON看起来像是“
”{“html”:“for…”
-所以要么你的例子说错了,要么你正试图用锤子敲螺丝。”-)警报(data.html)给出“undefined”。数据变量由我从服务器得到的响应填充,我相信它只是一个字符串,所以我认为必须对它进行解析才能使用它。如果我使用“{”html”:“test”、“newNodeName”:“}”作为parseJSON函数的输入,而不是在parsing data.html中正确填写“test”之后。@murze-您需要执行
data=jQuery.parseJSON(data)
,是这样的,还是问题的实质?@murze-
$。ajax
以本机方式处理此问题,只需像我更新的答案一样添加
数据类型
。还要注意,有一种方法可以使此问题更为清晰。将它们转义到和?我已经尝试过,但比我试图插入页面的html片段显示得更清楚iteraly,不作为html处理。字符<和>不是问题,请检查我的答案。
{"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('start');
data=data.replace('\','\\');
alert(data);
test= jQuery.parseJSON(data);
alert(test.html);
alert('stop');
jQuery.parseJSON(data);
alert(data.html);