2010-10-25 151 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 
}