【问题标题】:unable to parse json data that includes a single quote无法解析包含单引号的 json 数据
【发布时间】:2013-10-18 16:14:15
【问题描述】:

问题

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

“拉里的数据”

我已阅读以下文章: jQuery single quote in JSON response

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

代码

在我的模型中,我使用 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);
      }
    });

但我仍然在此特定记录上遇到解析错误。

任何建议将不胜感激。 谢谢。

编辑 1

我改变了我的逻辑,当它失败时,它会在控制台中打印出“request.responseText”。这是它的样子:

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

撇号仍然被转义。

编辑 2

这是我的代码在服务器端(也就是模型中)的样子:

get_device_records = function(ajaxdata)
   local results = list_devices(nil,false,ajaxdata.startpos, ajaxdata.numberofrecordstograb)
   return results.value
end

【问题讨论】:

  • 我认为你的 json 数据无效,jsonlint.com
  • 是的。我已经尝试在 jsonlint 中进行测试,但我所有的 json 数据都失败了。我不知道为什么。但是浏览器能够解析所有内容......除了那些带有单引号的内容。我想知道为什么我的数据在 jsonlint 中失败。
  • 你有dataType: 'json' 所以,不需要手动解析,jQuery 会做,它是(数据)已经解析的对象," 也被转义了,它应该是不封顶的.
  • 您的示例显示模型返回的内容根本无效 - 在真正的 JSON 中,不应该这样转义常规双引号,所以我猜您是从某个调试器中提取的。使用 Fiddler 或您的浏览器开发工具查看实际的 AJAX 响应以获取原始响应。
  • Joe Enos,我正在使用 Chrome 的调试工具,在“网络”选项卡下,我可以看到每个 ajax 调用得到的所有响应。我所有的 json 数据看起来都一样,并且被正确解析......?我对 json 太陌生了,不知道它为什么/如何工作……但确实如此。唯一失败的是带单引号的。

标签: javascript jquery ajax json


【解决方案1】:

看起来您正在服务器端进行双重序列化。例如,如果您的 Web 框架自动序列化返回的对象,但您对对象进行了额外显式的、不必要的序列化调用,就会发生这种情况。您的代码在没有 ' 案例的情况下工作的事实证明了这一点:jquery 会自动进行一次解析(因为 dataType),然后您运行另一个 parseJSON。那不应该工作:) 在服务器端修复您的序列化并从您的成功方法中删除不必要的 parseJSON 调用。其他所有解决方案都只是一种解决方法,而不是真正的解决方案。

【讨论】:

  • peterfoldi,请查看编辑 2。我认为我没有在服务器端进行双重序列化... ??在我的控制器中,我将数据从模型直接传递到视图。根本没有进行任何操作。
  • 在不了解您的框架的情况下,该代码无济于事。我怀疑框架会自动进行序列化。如果我是对的,那么您可以删除服务器端的编码调用和成功方法中的 parseJSON 调用,它应该可以工作。
  • 你好。好的。所以我试图删除视图中的 parseJSON 调用。还删除了所有逻辑来尝试做 jscript 替换的东西。在模型中,我删除了对 json.encode 的调用。它仍然在与撇号相同的记录上失败......但它是如何被逃脱的。所以在 Chrome 的调试窗口中,它看起来像“John Doe 的电话”……你想让我发布当前代码的干净版本吗?
  • 抱歉这个非常愚蠢的问题:您修改后的代码是否仍然返回“jsondata”而不是“results”,因为您现在没有为其赋值?再次为此感到抱歉:)
  • 我想你刚刚回复了我的“旧”评论。我刚改了。我有一个错误,是的......我没有返回 results.value。但我更新了我的评论,为您提供最新状态。一些东西仍在用撇号逃避我的记录......试图弄清楚它是什么。顺便提一句。非常感谢您迄今为止的明确解释/帮助。
【解决方案2】:

尝试替换

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

data = data.replace(/[\\"']/g, '\\$&').replace(/\u0000/g, '\\0');

我在解析 JSON 数据时遇到了类似的问题,这段代码 from another answer 解决了它

【讨论】:

    【解决方案3】:

    这是 json4lua 0.9.40 库的 lua json.encode 函数中的一个错误。它错误地转义了单引号。这在 0.9.50 中得到纠正:

    https://github.com/craigmj/json4lua

    【讨论】:

      【解决方案4】:

      只需从 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\"}]"
      

      【讨论】:

      • 我正在使用一个 lua 库,在我的模型中,我这样做类似于“local jsondata = json.encode(results.value)”,并且对整个字符串进行编码......我我想我可以尝试使用它来找到 \\'s 并用“'”替换它
      • 也不需要使用 data.replace("\\'", "'")。
      • Jacobson,我在模型中添加了逻辑以在将“\\”编码为 jsondata 后立即删除它。但它仍然失败,因为字符串现在看起来像“John Doe\'s phone”。请查看我帖子的 EDIT 1。
      猜你喜欢
      • 1970-01-01
      • 2019-10-22
      • 1970-01-01
      • 2016-08-08
      • 2022-12-11
      • 1970-01-01
      • 2021-12-12
      • 1970-01-01
      • 2023-04-01
      相关资源
      最近更新 更多