2014-07-03 122 views
0

我懷疑這是一個相當基本的概念,但兩天的試驗和錯誤,谷歌搜索和隨機鍵盤混搭使我失望。我試圖解析從URL返回的JSON,但我遇到了一個我懷疑與JSON內的數組有關的問題。用Ruby on Rails解析JSON

我在做什麼錯?

JSON:

{ 
"HotelInformationResponse": { 
    "@hotelId": "106347", 
    "customerSessionId": "0ABAA83F-4430-B291-3432-E0A2DC790CA0", 
    "HotelImages": { 
     "@size": "16", 
     "HotelImage": [ 
      { 
       "hotelImageId": 4694179, 
       "name": "", 
       "category": 1, 
       "type": 0, 
       "caption": "Exterior", 
       "url": "http://images.travelnow.com/hotels/1000000/10000/5900/5900/5900_44_b.jpg", 
       "thumbnailUrl": "http://images.travelnow.com/hotels/1000000/10000/5900/5900/5900_44_t.jpg", 
       "supplierId": 13, 
       "width": 350, 
       "height": 350, 
       "byteSize": 0 
      }, 
      { 
       "hotelImageId": 4694182, 
       "name": "", 
       "category": 2, 
       "type": 0, 
       "caption": "Lobby", 
       "url": "http://images.travelnow.com/hotels/1000000/10000/5900/5900/5900_47_b.jpg", 
       "thumbnailUrl": "http://images.travelnow.com/hotels/1000000/10000/5900/5900/5900_47_t.jpg", 
       "supplierId": 13, 
       "width": 350, 
       "height": 350, 
       "byteSize": 0 
      }, 
      { 
       "hotelImageId": 4694171, 
       "name": "", 
       "category": 2, 
       "type": 0, 
       "caption": "Lobby", 
       "url": "http://images.travelnow.com/hotels/1000000/10000/5900/5900/5900_36_b.jpg", 
       "thumbnailUrl": "http://images.travelnow.com/hotels/1000000/10000/5900/5900/5900_36_t.jpg", 
       "supplierId": 13, 
       "width": 350, 
       "height": 350, 
       "byteSize": 0 
      }, 
      { 
       "hotelImageId": 4694174, 
       "name": "", 
       "category": 2, 
       "type": 0, 
       "caption": "Lobby", 
       "url": "http://images.travelnow.com/hotels/1000000/10000/5900/5900/5900_39_b.jpg", 
       "thumbnailUrl": "http://images.travelnow.com/hotels/1000000/10000/5900/5900/5900_39_t.jpg", 
       "supplierId": 13, 
       "width": 350, 
       "height": 350, 
       "byteSize": 0 
      }, 
      { 
       "hotelImageId": 4694168, 
       "name": "", 
       "category": 3, 
       "type": 0, 
       "caption": "Guest Room", 
       "url": "http://images.travelnow.com/hotels/1000000/10000/5900/5900/5900_33_b.jpg", 
       "thumbnailUrl": "http://images.travelnow.com/hotels/1000000/10000/5900/5900/5900_33_t.jpg", 
       "supplierId": 13, 
       "width": 350, 
       "height": 350, 
       "byteSize": 0 
      }, 
      { 
       "hotelImageId": 4694173, 
       "name": "", 
       "category": 3, 
       "type": 0, 
       "caption": "Guest Room", 
       "url": "http://images.travelnow.com/hotels/1000000/10000/5900/5900/5900_38_b.jpg", 
       "thumbnailUrl": "http://images.travelnow.com/hotels/1000000/10000/5900/5900/5900_38_t.jpg", 
       "supplierId": 13, 
       "width": 350, 
       "height": 350, 
       "byteSize": 0 
      }, 
      { 
       "hotelImageId": 4694177, 
       "name": "", 
       "category": 3, 
       "type": 0, 
       "caption": "Guest Room", 
       "url": "http://images.travelnow.com/hotels/1000000/10000/5900/5900/5900_42_b.jpg", 
       "thumbnailUrl": "http://images.travelnow.com/hotels/1000000/10000/5900/5900/5900_42_t.jpg", 
       "supplierId": 13, 
       "width": 350, 
       "height": 350, 
       "byteSize": 0 
      }, 
      { 
       "hotelImageId": 4694165, 
       "name": "", 
       "category": 10, 
       "type": 0, 
       "caption": "Restaurant", 
       "url": "http://images.travelnow.com/hotels/1000000/10000/5900/5900/5900_30_b.jpg", 
       "thumbnailUrl": "http://images.travelnow.com/hotels/1000000/10000/5900/5900/5900_30_t.jpg", 
       "supplierId": 13, 
       "width": 350, 
       "height": 350, 
       "byteSize": 0 
      }, 
      { 
       "hotelImageId": 4694166, 
       "name": "", 
       "category": 10, 
       "type": 0, 
       "caption": "Restaurant", 
       "url": "http://images.travelnow.com/hotels/1000000/10000/5900/5900/5900_31_b.jpg", 
       "thumbnailUrl": "http://images.travelnow.com/hotels/1000000/10000/5900/5900/5900_31_t.jpg", 
       "supplierId": 13, 
       "width": 350, 
       "height": 350, 
       "byteSize": 0 
      }, 
      { 
       "hotelImageId": 6601500, 
       "name": "", 
       "category": 11, 
       "type": 0, 
       "caption": "Interior", 
       "url": "http://images.travelnow.com/hotels/1000000/10000/5900/5900/5900_56_b.jpg", 
       "thumbnailUrl": "http://images.travelnow.com/hotels/1000000/10000/5900/5900/5900_56_t.jpg", 
       "supplierId": 13, 
       "width": 350, 
       "height": 350, 
       "byteSize": 0 
      }, 
      { 
       "hotelImageId": 4694176, 
       "name": "", 
       "category": 12, 
       "type": 0, 
       "caption": "Pool", 
       "url": "http://images.travelnow.com/hotels/1000000/10000/5900/5900/5900_41_b.jpg", 
       "thumbnailUrl": "http://images.travelnow.com/hotels/1000000/10000/5900/5900/5900_41_t.jpg", 
       "supplierId": 13, 
       "width": 350, 
       "height": 350, 
       "byteSize": 0 
      }, 
      { 
       "hotelImageId": 4694170, 
       "name": "", 
       "category": 12, 
       "type": 0, 
       "caption": "Pool", 
       "url": "http://images.travelnow.com/hotels/1000000/10000/5900/5900/5900_35_b.jpg", 
       "thumbnailUrl": "http://images.travelnow.com/hotels/1000000/10000/5900/5900/5900_35_t.jpg", 
       "supplierId": 13, 
       "width": 350, 
       "height": 350, 
       "byteSize": 0 
      }, 
      { 
       "hotelImageId": 4694172, 
       "name": "", 
       "category": 12, 
       "type": 0, 
       "caption": "Pool", 
       "url": "http://images.travelnow.com/hotels/1000000/10000/5900/5900/5900_37_b.jpg", 
       "thumbnailUrl": "http://images.travelnow.com/hotels/1000000/10000/5900/5900/5900_37_t.jpg", 
       "supplierId": 13, 
       "width": 350, 
       "height": 350, 
       "byteSize": 0 
      }, 
      { 
       "hotelImageId": 4694180, 
       "name": "", 
       "category": 21, 
       "type": 0, 
       "caption": "Lounge/Bar", 
       "url": "http://images.travelnow.com/hotels/1000000/10000/5900/5900/5900_45_b.jpg", 
       "thumbnailUrl": "http://images.travelnow.com/hotels/1000000/10000/5900/5900/5900_45_t.jpg", 
       "supplierId": 13, 
       "width": 350, 
       "height": 350, 
       "byteSize": 0 
      }, 
      { 
       "hotelImageId": 4694181, 
       "name": "", 
       "category": 21, 
       "type": 0, 
       "caption": "Lounge/Bar", 
       "url": "http://images.travelnow.com/hotels/1000000/10000/5900/5900/5900_46_b.jpg", 
       "thumbnailUrl": "http://images.travelnow.com/hotels/1000000/10000/5900/5900/5900_46_t.jpg", 
       "supplierId": 13, 
       "width": 350, 
       "height": 350, 
       "byteSize": 0 
      }, 
      { 
       "hotelImageId": 4694175, 
       "name": "", 
       "category": 38, 
       "type": 0, 
       "caption": "Suite", 
       "url": "http://images.travelnow.com/hotels/1000000/10000/5900/5900/5900_40_b.jpg", 
       "thumbnailUrl": "http://images.travelnow.com/hotels/1000000/10000/5900/5900/5900_40_t.jpg", 
       "supplierId": 13, 
       "width": 350, 
       "height": 350, 
       "byteSize": 0 
      } 
     ] 
    } 
} 

}

我的簡化代碼:

api = Expedia::Api.new 
response = api.get_information({:hotelId => '106347'}) 
data = response.body 
parsed = JSON.parse(data.to_json) 

thumbnail = parsed['HotelInformationResponse']['HotelImages']['HotelImage']['thumbNailUrl'] 

這在縮略圖線返回錯誤 「的字符串的隱式轉換成整數」。我知道JSON列出了多於一個'thumbNailUrl',我需要在我請求時指定,但我不知道如何。我只想檢索第一個'thumbNailUrl'。

順便說一句,我使用的是位於這裏的EAN API寶石:https://github.com/zaidakram/expedia

回答

0

此行parsed['HotelInformationResponse']['HotelImages']給你HashArray。所以你需要通過索引訪問數組中的每個Hash。因此,你需要下面走 -

parsed['HotelInformationResponse']['HotelImages']['HotelImage'][0]['thumbnailUrl'] 

如果你想獲得的所有縮略圖然後,遍歷它作爲

thumbnails = parsed['HotelInformationResponse']['HotelImages']['HotelImage'].map do |hash| 
    hash[thumbnailUrl] 
end 
+0

我懷疑,我已經嘗試過,但是<%= thumbnail%>不會返回任何內容,只是空白。 – stucook1

+0

@ user3799686因爲'thumbnailUrl'是您使用的實際*鍵*而不是* thumbNailUrl *。 –

+0

DOH !!!!!謝謝! – stucook1

0

爲了得到第一個酒店形象,你可以這樣做:

thumbnail = parsed['HotelInformationResponse']['HotelImages']['HotelImage'][0]['thumbNailUrl'] 

如果你想獲得所有的縮略圖,你可以這樣做:

thumbnails = [] 

parsed['HotelInformationResponse']['HotelImages']['HotelImage'].each { |thumbnail| thumbnails << thumbnail['thumNailUrl'] } 
+0

我懷疑這一點,我已經試過了,但隨後'<%= thumbnail%>'什麼也沒有返回,只是空白。 – stucook1