使用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:
未定义
这适用于前面提到的所有对象。
答案 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 () { ... });
这个功能不一样 $().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来格式化空字符串来解决它。结果是“\”\“”基本上“”;