代码之家  ›  专栏  ›  技术社区  ›  murze

jquery.parsejson是否能够处理所有有效的json?

  •  2
  • murze  · 技术社区  · 14 年前

    这段有效的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 回复  |  直到 14 年前
        1
  •  3
  •   Nick Craver    14 年前

    您发布的已经是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
  •  2
  •   murze    14 年前

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

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

    当我重新命名钥匙时 htmlstring 这个 parseJSON -功能正常。在php函数json_encode完成它的工作之后,现在不需要再逃避任何东西了。

    我现在相信.html是jquery中的一个保留字,所以如果您想使用parsejson,就不要向它提供一个名为“html”的键的json。

        3
  •  1
  •   T.J. Crowder    14 年前

    我建议从你的摘录开始,然后慢慢地从那些不起作用的部分添加回文本,直到你发现哪个位导致了问题。这个 JSON syntax 非常非常简单,如果jquery有问题,我会感到惊讶。

    我想知道您的“script”标签和“function”(想:“我想知道这些是否触发了一个漏洞保护或者什么东西?”)但jquery 1.4.1的快速检查表明不是这样的。

    编辑

    问题出在其他地方,下面的方法适用于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>
    

    杰森:

    {"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":""}
    
        4
  •  0
  •   systempuntoout    14 年前

    尝试:

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

    它对我有用。

        5
  •  0
  •   murze    14 年前

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

    问题是由“<”和“>!”字符引起的。一旦我试图传递这些字符,parsejson函数就会失败。

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

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