Javascript 无法分析包含单个引号的json数据

Javascript 无法分析包含单个引号的json数据,javascript,jquery,ajax,json,Javascript,Jquery,Ajax,Json,问题 我的一些json数据出现了解析错误,因为它包含单引号。 例如,我的一些数据可能如下所示: [{\"createddatetime\":\"2013-09-10 17:56:55\",\"description\":\"John Doe\'s phone\",\"number\":\"72051\",\"createdname\":\"conversion script\",\"user\":\"23123\",\"position\":\"46\",\"id\":\"49\",\"user

问题

我的一些json数据出现了解析错误,因为它包含单引号。 例如,我的一些数据可能如下所示:

[{\"createddatetime\":\"2013-09-10 17:56:55\",\"description\":\"John Doe\'s phone\",\"number\":\"72051\",\"createdname\":\"conversion script\",\"user\":\"23123\",\"position\":\"46\",\"id\":\"49\",\"user_id\":\"822\",\"password\":\"rwer234\"}]"
  $.ajax({
      url:myurl + '?startpos=' + page_index * items_per_page + '&numberofrecordstograb=' + items_per_page + '&viewtype=json',

      success: function(data){            

            console.log('inside');    
             for(var i=0;i<data.length;i++) {
                        var deviceobj = data[i];                        
                        newcontent = newcontent + "<TR>";
                        newcontent=newcontent + '<TD>';    

                        //add EDIT hyperlink
                        if ($("#editdevicesettings").val() == "true") {              
                            var temp  = $("#editlinkpath").val();
                            newcontent=newcontent +  temp.replace("xxx",deviceobj["device_id"]) + '&nbsp;&nbsp;';
                        } 

                        //add DELETE hyperlink
                        if ($("#deletedevice").val() == "true") {              
                            var temp  = $("#deletelinkpath").val();
                            newcontent=newcontent +  temp.replace("xxx",deviceobj["device_id"]);
                        }                                 
                        newcontent=newcontent + '</TD>';

                        newcontent=newcontent + '<TD>' + deviceobj["number"] +'</TD>';
                        newcontent=newcontent + '<<TD>' + deviceobj["user"] + '</TD>';
                        newcontent=newcontent + '<<TD>' + deviceobj["password"] + '</TD>';
                        if (deviceobj["name"]) {
                              newcontent=newcontent + '<TD>' + deviceobj["name"] + '</TD>';
                        } 
                        else  {
                             newcontent=newcontent + '<TD>&nbsp;</TD>';
                        }
                        newcontent=newcontent + '<TD>' + unescape(deviceobj["description"])  + '</TD>';
                        newcontent = newcontent + "</TR>";         
                }// end for 
                // Replace old content with new content
                $('#Searchresult').html(newcontent);                    
            }//end if

      },
      error: function(request, textStatus, errorThrown) {
        console.log(textStatus);
        console.log('========');
        console.log(request);

      },
      complete: function(request, textStatus) { //for additional info
        //alert(request.responseText);
        console.log(textStatus);
      }
    });
“拉里的数据”

我读过以下文章:

我一直在尝试实现一些解决方案,但我无法摆脱我的解析错误

代码

在我的模型中,我使用lua库将数据编码为json。 模型返回的数据如下所示:

[{\"createddatetime\":\"2013-09-10 17:56:55\",\"description\":\"John Doe\'s phone\",\"number\":\"72051\",\"createdname\":\"conversion script\",\"user\":\"23123\",\"position\":\"46\",\"id\":\"49\",\"user_id\":\"822\",\"password\":\"rwer234\"}]"
  $.ajax({
      url:myurl + '?startpos=' + page_index * items_per_page + '&numberofrecordstograb=' + items_per_page + '&viewtype=json',

      success: function(data){            

            console.log('inside');    
             for(var i=0;i<data.length;i++) {
                        var deviceobj = data[i];                        
                        newcontent = newcontent + "<TR>";
                        newcontent=newcontent + '<TD>';    

                        //add EDIT hyperlink
                        if ($("#editdevicesettings").val() == "true") {              
                            var temp  = $("#editlinkpath").val();
                            newcontent=newcontent +  temp.replace("xxx",deviceobj["device_id"]) + '&nbsp;&nbsp;';
                        } 

                        //add DELETE hyperlink
                        if ($("#deletedevice").val() == "true") {              
                            var temp  = $("#deletelinkpath").val();
                            newcontent=newcontent +  temp.replace("xxx",deviceobj["device_id"]);
                        }                                 
                        newcontent=newcontent + '</TD>';

                        newcontent=newcontent + '<TD>' + deviceobj["number"] +'</TD>';
                        newcontent=newcontent + '<<TD>' + deviceobj["user"] + '</TD>';
                        newcontent=newcontent + '<<TD>' + deviceobj["password"] + '</TD>';
                        if (deviceobj["name"]) {
                              newcontent=newcontent + '<TD>' + deviceobj["name"] + '</TD>';
                        } 
                        else  {
                             newcontent=newcontent + '<TD>&nbsp;</TD>';
                        }
                        newcontent=newcontent + '<TD>' + unescape(deviceobj["description"])  + '</TD>';
                        newcontent = newcontent + "</TR>";         
                }// end for 
                // Replace old content with new content
                $('#Searchresult').html(newcontent);                    
            }//end if

      },
      error: function(request, textStatus, errorThrown) {
        console.log(textStatus);
        console.log('========');
        console.log(request);

      },
      complete: function(request, textStatus) { //for additional info
        //alert(request.responseText);
        console.log(textStatus);
      }
    });
在我看来,我的代码目前如下所示:

[{\"createddatetime\":\"2013-09-10 17:56:55\",\"description\":\"John Doe\'s phone\",\"number\":\"72051\",\"createdname\":\"conversion script\",\"user\":\"23123\",\"position\":\"46\",\"id\":\"49\",\"user_id\":\"822\",\"password\":\"rwer234\"}]"
  $.ajax({
      url:myurl + '?startpos=' + page_index * items_per_page + '&numberofrecordstograb=' + items_per_page + '&viewtype=json',

      success: function(data){            

            console.log('inside');    
             for(var i=0;i<data.length;i++) {
                        var deviceobj = data[i];                        
                        newcontent = newcontent + "<TR>";
                        newcontent=newcontent + '<TD>';    

                        //add EDIT hyperlink
                        if ($("#editdevicesettings").val() == "true") {              
                            var temp  = $("#editlinkpath").val();
                            newcontent=newcontent +  temp.replace("xxx",deviceobj["device_id"]) + '&nbsp;&nbsp;';
                        } 

                        //add DELETE hyperlink
                        if ($("#deletedevice").val() == "true") {              
                            var temp  = $("#deletelinkpath").val();
                            newcontent=newcontent +  temp.replace("xxx",deviceobj["device_id"]);
                        }                                 
                        newcontent=newcontent + '</TD>';

                        newcontent=newcontent + '<TD>' + deviceobj["number"] +'</TD>';
                        newcontent=newcontent + '<<TD>' + deviceobj["user"] + '</TD>';
                        newcontent=newcontent + '<<TD>' + deviceobj["password"] + '</TD>';
                        if (deviceobj["name"]) {
                              newcontent=newcontent + '<TD>' + deviceobj["name"] + '</TD>';
                        } 
                        else  {
                             newcontent=newcontent + '<TD>&nbsp;</TD>';
                        }
                        newcontent=newcontent + '<TD>' + unescape(deviceobj["description"])  + '</TD>';
                        newcontent = newcontent + "</TR>";         
                }// end for 
                // Replace old content with new content
                $('#Searchresult').html(newcontent);                    
            }//end if

      },
      error: function(request, textStatus, errorThrown) {
        console.log(textStatus);
        console.log('========');
        console.log(request);

      },
      complete: function(request, textStatus) { //for additional info
        //alert(request.responseText);
        console.log(textStatus);
      }
    });
撇号仍然漏掉了

编辑2

下面是我的代码在服务器端的样子(在模型中又称为):

试着替换

data = data.replace("\\'", "'");


我在解析JSON数据时遇到了类似的问题,这段代码解决了这个问题,只需从JSON响应中去掉\\。我的意思是,按原样传递单引号,如下所示:

[{\"createddatetime\":\"2013-09-10 17:56:55\",\"description\":\"John Doe's phone\",\"number\":\"72051\",\"createdname\":\"conversion script\",\"user\":\"23123\",\"position\":\"46\",\"id\":\"49\",\"user_id\":\"822\",\"password\":\"rwer234\"}]"

看起来您正在服务器端执行双重序列化。例如,如果您的web框架自动序列化返回的对象,但您对对象进行了额外的显式、不必要的序列化调用,则会发生这种情况。代码不使用“cases”的事实证明了这一点:jquery自动进行一次解析(因为数据类型),然后运行另一次parseJSON。这不应该奏效:)
修复服务器端的序列化,并从success方法中删除不必要的parseJSON调用。其他任何解决方案都只是一种解决方法,而不是真正的修复方法。

这是json4lua 0.9.40库的lua json.encode函数中的一个bug。它错误地避开了单引号。在0.9.50中对此进行了修正:


我认为您的json数据无效,是的。我曾尝试在jsonlint中进行测试,但我所有的json数据都失败了。我不知道为什么。但是浏览器可以解析所有内容。。。除了那些单引号的。我想知道为什么我的数据在jsonlint中失败。您有
数据类型:“json”
所以,不需要手动解析它,
jQuery
将完成它,它是(数据)已经解析过的对象,也是
是转义的,它应该是uncapped。您显示模型返回内容的示例根本无效-在真正的JSON中,常规双引号不应该这样转义,所以我猜您是从某个调试器中提取的。使用Fiddler或浏览器开发工具查看实际的AJAX响应以获得原始响应。Joe Enos,我正在使用Chrome的调试工具,在“网络”选项卡下,我可以看到每次AJAX调用得到的所有响应。我所有的json数据看起来都一样,并且被正确解析?我对json太陌生了,不知道它为什么/如何工作。。。但事实确实如此。唯一失败的是带有单引号的字符串。我使用的是lua库,在我的模型中,我这样做类似于“local jsondata=json.encode(results.value)”,并对整个字符串进行编码……我想我可以尝试使用它来查找\'并将其替换为“'”。不需要使用数据。替换(\\',“'))Jacobson,我在模型中添加了逻辑,以便在将“\\”编码为jsondata后立即删除它。但它仍然失败,因为字符串现在看起来像“John Doe的手机”。请签出我文章的编辑1。彼得福尔迪,请签出编辑2。我不认为我在服务器端做双重序列化??在我的控制器中,我直接将数据从模型传递到视图。根本没有进行任何操作。如果不了解您的框架,这些代码没有多大帮助。我怀疑的是,该框架会自动进行序列化。如果我是对的,那么您可以从success方法中删除服务器端的encode调用和parseJSON调用,它应该可以正常工作。好啊因此,我尝试删除视图中的parseJSON调用。还删除了所有尝试执行jscript替换的逻辑。在模型中,我删除了对json.encode的调用。在同一条记录中,它仍然用撇号。。。但有些人知道它是如何逃脱的。所以在Chrome的调试窗口中,它看起来像是“JohnDoe的手机”。。。你想让我发布一个干净版本的当前代码吗?很抱歉问了一个非常愚蠢的问题:你修改过的代码不仍然返回“jsondata”而不是“results”,它是空的,因为你现在没有给它赋值吗?再次对此表示抱歉:)我想你刚刚回应了我的“旧”评论。我刚换了。我有一只虫子,是的。。。我没有返回results.value。但是我更新了我的评论给你最新的状态。我的记录中还有一些东西用撇号漏掉了。。。想弄清楚是什么。顺便说一句,非常感谢您迄今为止的明确解释/帮助。