【问题标题】:jQuery.ajax() + empty JSON object = parse errorjQuery.ajax() + 空 JSON 对象 = 解析错误
【发布时间】:2009-04-06 09:21:28
【问题描述】:

使用 jQuery 加载一些 JSON 数据时出现解析错误。这是我的代码的 sn-p:

jQuery.ajax({
    dataType: "json",

    success: function (json)
    {
        jQuery.each(json, function ()
        {
            alert(this["columnName"]);
        });
    }
});

解析非空 JSON 对象时没有错误。所以我的猜测是问题出在我的序列化程序上。


问题是:如何格式化 jQuery 不会认为格式错误的空 JSON 对象?

这是我迄今为止尝试过的,但没有成功:

{[]}

{[null]}

{}

{null}


{"rows": []}

{"rows": null}

{"rows": {}}



更新:

我可以理解我有些含糊不清——让我试着澄清一下:

解析 JSON 对象不是这里的问题——我认为是 JQuery。

jQuery 抛出一个解析错误(调用错误函数)。似乎 jQuery 的内部 JSON 验证不接受任何前面提到的对象。甚至不是有效的。

误差函数的输出为:

XMLHttpRequest: XMLHttpRequest readyState=4 status=200
textStatus: parsererror
errorThrown: undefined

这适用于前面提到的所有对象。

【问题讨论】:

  • 这就是子集的问题,他们没有全部。
  • 除了你是第三个例子之外的所有例子都不是有效的 JSON,因为字典中没有键
  • 更新了一些尝试。仍然出现解析错误。
  • 一个json对象只是一个对象字面量?还是真的?
  • 我想我也有同样的问题。我只是在 FireBug 中看到错误消息:“[Exception...”'SyntaxError: JSON.parse' when调用方法:[nsIDOMEventListener::handleEvent]”nsresult:“0x8057001c (NS_ERROR_XPC_JS_THREW_JS_OBJECT)”位置:“”数据: 不]”。有什么解决办法吗?

标签: javascript jquery json


【解决方案1】:

解决方案是从服务器返回状态码204而不是200,204是“无内容”,它会在不尝试调用解析器的情况下返回成功

【讨论】:

    【解决方案2】:

    首先,{[]}{[null]}{null} 不起作用,因为它们都是无效的 JSON 对象(由 JSON validator 验证)。

    其余对象都是有效的 JSON 对象,因此您的 success 函数应该会被调用。

    如果您传递一个非数组或类似数组的对象对象,那么each 函数将通过其命名属性枚举您的json 对象。对于您的三个对象,每个对象都具有rows 属性,this 将分别设置为[]null{},它们都没有columnName 属性,因此将出现未定义的错误被扔掉。

    另一方面,您的 {} 对象没有属性,因此不应导致错误,因为 each 调用将循环 0 次。如果将以下行添加为success 函数的第一行,会显示什么?

    alert(typeof json + ' ' + (json == null));
    

    【讨论】:

      【解决方案3】:

      你正在寻找这个:

      []
      

      一个空数组。也就是说,如果您打算立即对其进行迭代,那么您需要的是一个数组。

      【讨论】:

        【解决方案4】:

        您的网络服务可能返回 null。我发现从 Web 服务调用返回 null 会返回状态码为 200“Ok”的响应,但 jQuery 之后会引发 parseerror。

        如果是这种情况,它与您发送到服务器的内容无关,而与服务器发送回的所有内容无关。

        如果您能够更改 Web 服务,您可能想尝试返回一个空的 JSON 对象,或者一个默认值而不是 Null。或者,您可以在错误处理程序中检查此错误场景,知道这意味着您的调用返回 null。

        【讨论】:

          【解决方案5】:

          您是否在每个之前验证了 JSON 是否正确返回?将空值设为{},并验证.each之前是不是这样

          此外,了解您的 JSON 在有数据时的样子也会有所帮助。

          【讨论】:

            【解决方案6】:

            代替:

            $(json).each(function () { ... });
            

            我想你想使用:

            $.each(json, function () { ... });
            

            来自jQuery.each documentation

            这个功能不一样 $().each() - 用于迭代, 排他地,通过一个 jQuery 对象。 该函数可用于迭代 胜过一切。

            【讨论】:

            • 类型'o。但是谢谢 - 编辑并保存。虽然不是一个真正的答案。
            【解决方案7】:

            我在从服务器请求有效 JSON 时遇到了类似的问题。

            我的服务器提供的是 text/javascript 的内容类型

            我没有使用 'dataType' 的可选 jQuery.ajax 设置,所以 jQuery 将输出解释为 javascript(例如填充的 JSON),而不是整洁的 JSON。

            在传递给 jQuery 的 ajax 方法的设置对象中添加一个 dataType:'JSON' 解决了这个问题。

            【讨论】:

              【解决方案8】:

              也有这个问题,通过在我的网络服务中使用 jsonserializer 格式化一个空字符串来解决它。结果是 "\"\"" 本质上是 "" ;

              【讨论】:

                猜你喜欢
                • 2011-10-02
                • 2017-01-02
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2013-03-06
                相关资源
                最近更新 更多