【问题标题】:Invalid json has suddenly started throwing parse errors无效的 json 突然开始抛出解析错误
【发布时间】:2012-04-16 08:24:05
【问题描述】:

我在两个地方观察到了这一点。两者都是 AJAX 调用,它们返回一些 JSON,用于填充两个选择下拉列表的选项。我目前正在使用 jquery 选择的插件对这些下拉列表应用增强功能,我想是一些变化导致了这个问题。我不确定到底是什么,因为我恢复了我收到解析错误的那个模块的更改,但错误仍在发生。

所以,我在问,一般来说,无效 JSON 突然导致问题的原因可能是什么。请注意,返回的 JSON 一直是无效的。我没有对此进行任何更改。此外,我没有对 $.ajax 调用进行任何更改。 JSON 样本 -

{
 "result":"success",
"reqparams": 
{"site_id": {"name":"site_id","display_name":"","possible_values":"","default_value":"","editable":"1","description":"the ad slot id provided by your 4th Screen account manager",},},
"optparams": {
"keywords": {"name":"keywords","display_name":"","possible_values":"","default_value":"","editable":"1","description":"",},
"reachability": {"name":"reachability","display_name":"","possible_values":"wifi[ADMARVEL_SEP]cell","default_value":"","editable":"1","description":"Information about how the device is being connected to the internet.",},
},
}

注意:多余的逗号,例如在“描述”属性的值之后。

更新 生成 JSON 的代码 - 示例代码 - 请忽略未使用 json_encode 的事实。这是非常古老的代码。

if (is_array($reqd_params) && count($reqd_params) > 0)
        {
            header("HTTP/1.1 200 OK");
            echo '{
                    "result":"success",
                    "reqparams": {';
            foreach ($reqd_params as $paramKey => $paramValArr)
            {
                echo '"'.$paramValArr['name'].'": {';
                echo '"name":"'.$paramValArr['name'].'",';
                echo '"display_name":"'.$paramValArr['display_name'].'",';
                echo '"possible_values":"'.$paramValArr['possible_values'].'",';
                echo '"default_value":"'.$paramValArr['default_value'].'",';
                echo '"editable":"'.$paramValArr['editable'].'",';
                echo '"description":"'.addslashes($paramValArr['description']).'",';
                echo '},';
            }
            echo '}';

            if(!empty($reportData) && $reportData != -1)
            {
                echo',';
                echo '"reportData":"'.htmlspecialchars($reportData).'"';
            }

            echo ' }';

        }

客户端代码

$.ajax({
            type: "POST",
            url: posturl,
            data : data,
            dataType: "json",
            async: false,
            success: function(msg){

                         //not coming here
                        },

                        error: function(jqXHR, textStatus, errorThrown){
                alert("error "+errorThrown);

                                //alerts parse error
            }
                });

【问题讨论】:

  • 能否请您发布生成此 JSON 的代码。问题很简单,它在每一行都添加了一个尾随逗号。只需更改算法以检测每个对象的最后一个属性。
  • 让您的代码返回有效的 JSON。它过去的工作经验不是故意提供错误 JSON 的借口。
  • @Rob W 我同意你的观点,但我担心我更改的内容可能会破坏所有返回无效 JSON 的现有位置。我可能会错过修复所有的地方。
  • 我认为像更新 jquery 这样的事情可能会导致这种情况。
  • 您是说这个无效的 JSON 确实在您的网站上运行?

标签: jquery json parse-error


【解决方案1】:

我会说这个事实

I upgraded from jquery 1.3.2 to 1.6.4.

(来自cmets)

以及您的 jquery 代码曾经接受不正确的 JSON(如:它正在做一些“错误”的事情)但现在按预期工作的事实是所见行为的来源,就像您的问题一样。

作为一种解决方案,如果真的无法更改代码,您可以更改预期结果的数据类型,然后手动解析您的 specialJSON 代码。

【讨论】:

  • 哇很好的答案!目前没有其他方法可以允许无效的json吗?在一个地方进行简单的更改?
  • 您可以尝试使用不同的(文本?)数据类型,然后使用$.parseJSON 解析字符串。我不确定为什么这会起作用,但对api.jquery.com/jQuery.parseJSON 的评论暗示来自.ajax 的解析器更加严格。显然,您的情况很可能有所不同,它仍然会引发错误。您可能会被困在专门为您的数据编写一个函数以从您自己的 JSON 版本中生成有效的 JSON,然后在其上调用 $.parseJSON
  • 我做了同样的事情,将数据类型更改为“文本”并做了 msg = $.parseJSON(msg);一切正常。这很好,但我想问是否有其他方法可以在每个返回无效 JSON 的地方减少执行此操作的步骤。我想知道为什么 jquery 之前允许接受无效的 JSON,但在这个版本中不允许。那么,他们是否有可能保留允许无效 JSON 的选项?顺便再次感谢您的帮助。为您 +1。
  • 我认为这是一个错误,现在该错误已修复。您的代码依赖于存在的错误,因此预计这将很难停止。一件事是回到以前的 jquery 版本。另一个是修复你的功能,但正如你所说,这会很可怕。对不起,我不知道任何更快的方法;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-15
  • 1970-01-01
  • 1970-01-01
  • 2019-05-22
  • 1970-01-01
相关资源
最近更新 更多