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

cll*_*pse 15 javascript jquery json

使用jQuery加载一些JSON数据时,我得到一个解析错误.这是我的代码片段:

jQuery.ajax({
    dataType: "json",

    success: function (json)
    {
        jQuery.each(json, function ()
        {
            alert(this["columnName"]);
        });
    }
});
Run Code Online (Sandbox Code Playgroud)

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


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

这是我到目前为止所尝试的,没有成功:

{[]}

{[null]}

{}

{null}


{"rows": []}

{"rows": null}

{"rows": {}}
Run Code Online (Sandbox Code Playgroud)



更新:

我能理解我有点模糊 - 让我试着澄清一下:

解析JSON对象不是问题 - JQuery是 - 我想.

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

错误函数的输出是:

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

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

小智 10

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


Sim*_*hke 5

首先{[]},{[null]}并且{null}将无法工作,因为它们都是无效的JSON对象(由JSON验证器验证).

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

如果传递非数组或类数组的对象对象,则该each函数将json通过其命名属性枚举对象.在你的三个对象,每有一个的情况下,rows属性this将被设置为[],null,和{}分别,没有一个是有一个columnName属性,这样一个未定义的错误将被抛出.

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

alert(typeof json + ' ' + (json == null));
Run Code Online (Sandbox Code Playgroud)


Sim*_*hke 1

代替:

$(json).each(function () { ... });
Run Code Online (Sandbox Code Playgroud)

我想你想使用:

$.each(json, function () { ... });
Run Code Online (Sandbox Code Playgroud)

来自jQuery.each 文档

此函数与$().each()不同 - 它用于专门迭代 jQuery 对象。该函数可用于迭代任何内容。