繁体   English   中英

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

[英]jQuery.ajax() + empty JSON object = parse error

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

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

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

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

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

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

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

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

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

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

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

你在找这个:

[]

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

代替:

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

我想你想要使用:

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

jQuery.each文档

这个函数与$()。each()不同 - 它用于独占于jQuery对象进行迭代。 此函数可用于迭代任何内容。

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM