2010-10-25 96 views
2

我有一个webservice(RestEasy)返回一个JSON对象,它包含一个List < ..>元素。我试图解析JavaScript for循环中的结果。如果列表<>元素有2个或更多元素,则一切正常。如果列表<>元素只有一个元素,则JavaScript循环会中断。用JavaScript解析JSON

这是因为当只有一个元素时,JSON respresentation实际上会改变。例如:

{"parent":[{"a":1},{"b":2}]} 

作品就好了... ...但由于某些原因,JSON看起来是这样的一个孩子:

{"parent":{"a":1}} 

注意......这个数组指针[]缺失。

那是标准的JSON吗?这种符号强制丑陋,不必要的检查在我的JavaScript的存在或大小,等等的预期阵列...

这是一致的标准做法?为什么JSON不会返回一个列表?

{"parent":[{"a":1}]} 

这可能是我的服务器端的假象,并将其他服务器端生成实际建立一个不同的JSON表示?我甚至试图使用dojo.forEach,它很好,直到它到达单个元素数组,不幸的是,缺乏任何类型的列表符号。

+0

答案都相当一致。感谢您提供的所有答复。 – 2010-10-25 23:31:26

回答

0

这是您的服务器端的一个工件。可能是你的框架以这种方式向JSON生成器提供数据结构,我想这不是发生器本身的问题。

7

这与JSON格式无关。 JSON格式绝对区分{"a":1}(一个对象)和[{"a":1}](包含一个对象作为唯一元素的数组)。

看到它的行为有所不同是服务器端生成器中的一个错误。你必须深入研究这个代码,找出为什么它会选择歪曲单元素数组。

1

这不是JSON本身的问题。 JSON仅仅是一套词汇规则。相反,这听起来像是一个糟糕的设计或REST Web服务的实现。

如果规范说它会根据是否有一个或几个项目来改变结构,那么我会说这是一个令人惊讶的设计,它违反了“最不惊讶的原则”。如果规范没有说明这一点,那么这将是Web服务中的一个错误。

0

虽然不是JS/JSON的问题,一个JS可行的解决方法,像这样:

if(data["parent"]["child"] instanceof Array) { 
    $.each(data["parent"]["child"], function(i, attr) { 
     var myVal = attr["@name"]; 
     //now do something 
    });  
} 
else { 
    var myVal = data["parent"]["child"]["@name"]; 
    // do something 
}