这段有效的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\"> <\/dt>\n<dd id=\"title-element\">\n<input type=\"text\" name=\"title\" id=\"title\" value=\"Artikel K\"><\/dd>\n<dt id=\"articleFormSubmitted-label\"> <\/dt>\n<dd id=\"articleFormSubmitted-element\">\n<input type=\"hidden\" name=\"articleFormSubmitted\" value=\"1\" id=\"articleFormSubmitted\"><\/dd>\n<dt id=\"submit-label\"> <\/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不相符的特殊字符?
答案 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\"> <\/dt>\n<dd id=\"title-element\">\n<input type=\"text\" name=\"title\" id=\"title\" value=\"Artikel K\"><\/dd>\n<dt id=\"articleFormSubmitted-label\"> <\/dt>\n<dd id=\"articleFormSubmitted-element\">\n<input type=\"hidden\" name=\"articleFormSubmitted\" value=\"1\" id=\"articleFormSubmitted\"><\/dd>\n<dt id=\"submit-label\"> <\/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代码中,我尝试使用
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\"> <\/dt>\n<dd id=\"title-element\">\n<input type=\"text\" name=\"title\" id=\"title\" value=\"Artikel K\"><\/dd>\n<dt id=\"articleFormSubmitted-label\"> <\/dt>\n<dd id=\"articleFormSubmitted-element\">\n<input type=\"hidden\" name=\"articleFormSubmitted\" value=\"1\" id=\"articleFormSubmitted\"><\/dd>\n<dt id=\"submit-label\"> <\/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的代码中。