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

18

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

jQuery.ajax({
    dataType: "json",

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

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


问题是:如何格式化一个空的JSON对象,使得jQuery不会认为它是畸形的?

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

{[]}

{[null]}

{}

{null}


{"rows": []}

{"rows": null}

{"rows": {}}



更新:

我知道自己表述得有点含糊,让我来澄清一下:

解析JSON对象不是问题——问题出在JQuery上。

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

错误函数的输出是:

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

对于所有先前提到的对象都是如此。


这就是子集的问题,它们并不全都拥有。 - Toon Krijthe
除了你的第三个例子之外,其他都不是有效的JSON,因为字典中没有键。 - cobbal
更新了几次尝试,仍然出现解析错误。 - cllpse
一个 JSON 对象只是一个对象字面量吗?还是并不完全是? - theman_on_vista
我认为我有同样的问题。我在FireBug中只看到错误消息:“[Exception...“'SyntaxError: JSON.parse' when calling method: [nsIDOMEventListener::handleEvent]” nsresult:“0x8057001c(NS_ERROR_XPC_JS_THREW_JS_OBJECT)” location:“<unknown>” data:no]”。已经有解决方案了吗? - BlaM
我认为这是jQuery的一个缺陷。我有一些返回数组的rest调用。例如,/rest/orders。当没有订单时,我会序列化出一个空的Java ArrayList,表示零个订单,并且我会得到200状态和parseerror。那不对。我希望我的数据对象为空。虽然我可以只输出“[]”作为空数组,但我正在使用一个Apache框架来进行所有序列化,所以我不能混合传递它Java对象和包含“[]”的字符串。 - Perry Tew
8个回答

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

5
首先,{[]}{[null]}{null}都是无效的JSON对象(通过JSON验证器验证)。
其余的对象都是有效的JSON对象,因此您的success函数应该被调用。
如果传递一个非数组或类似数组的对象,则each函数将通过其命名属性枚举您的json对象。对于每个具有rows属性的三个对象,this将分别设置为[]null{},它们都没有columnName属性,因此会抛出未定义错误。
另一方面,您的{}对象没有属性,因此不应该导致错误,因为each调用将循环0次。如果将以下行添加为success函数的第一行,它会显示什么?
alert(typeof json + ' ' + (json == null));

2
你正在寻找这个:

您正在寻找以下内容:

[]

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


2
您的网络服务可能会返回null。我发现从Web服务调用返回null会返回状态代码为“200”的响应,“Ok”,但是jQuery在此之后抛出一个parseerror。
如果是这种情况,那么与您发送到服务器的内容无关,而是与服务器返回的内容有关。
如果您能够更改Web服务,您可能想尝试返回一个空JSON对象或默认值,而不是Null。或者,您可以在错误处理程序中检查此错误场景,知道这意味着您的调用返回了null。

1

改为:

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

我认为你想要使用:

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

来自jQuery.each文档

这个函数与$().each()不同 - 它用于迭代,仅限于jQuery对象。这个函数可以用于迭代任何东西。


打字错误。但还是谢谢您修改并保存了。不过这并不算答案。 - cllpse

1

在进行each操作之前,您是否验证了JSON是否正确返回?将空值设置为{},并在.each之前验证它是否是这样的。

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


0

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

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

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

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


0

我也遇到了这个问题,并通过在我的 Web 服务中使用 Jsonserializer 格式化空字符串来解决它。结果是"\"\"",本质上是"";


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接