jQuery.ajax()+空JSON对象=解析错误

时间:2009-04-06 09:21:29

标签: javascript jquery json

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

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:未定义

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

8 个答案:

答案 0 :(得分:9)

解决方案是从服务器返回204而不是200的状态代码,204是“无内容”,并且在不尝试调用解析器时它将返回成功

答案 1 :(得分:5)

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

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

如果传递非数组或类数组的对象,则each函数将按其命名属性枚举json对象。对于您的三个对象,每个对象都有rows属性this,将分别设置为[]null{},其中没有一个columnName属性,因此将抛出未定义的错误。

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

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

答案 2 :(得分:2)

你正在寻找这个:

[]

一个空数组。也就是说,如果你打算立即迭代它,那么你需要的是一个数组。

答案 3 :(得分:2)

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

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

如果您能够更改Web服务,则可能需要尝试返回空JSON对象或默认值而不是Null。或者,您可以在错误处理程序中检查此错误情况,因为这意味着这意味着您的调用返回null。

答案 4 :(得分:1)

而不是:

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

我想你想要使用:

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

来自jQuery.each documentation

  

这个功能不一样   $().each() - 用于迭代,   仅限于jQuery对象。   此函数可用于迭代   什么都可以。

答案 5 :(得分:1)

您是否确认JSON是否在每个之前首先正确返回?将空值设置为{},并验证它是否与之前相同.each

当有数据时,了解JSON的外观也很有帮助。

答案 6 :(得分:0)

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

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

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

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

答案 7 :(得分:0)

也有这个问题,并通过在我的Web服务中使用jsonserializer来格式化空字符串来解决它。结果是“\”\“”基本上“”;