2016-01-06 60 views
0

好吧,即時通訊問題鑽入下面的代碼中檢索到的響應json中。在使用alamofire響應json時遇到了麻煩。 Swift

快照1:

Snapshot 1

快照2:

Snapshot 2

我得到的JSON以上作爲響應,然而,當我試圖深入到JSON我無法訪問鑰匙「地址」或任何其他在預訂中持有的鑰匙。它會查找預訂,但會爲每個鍵的值(地址,州,郵編和城市)分配我創建的變量並將這些變量指定爲空。我唯一的理論是響應json在預訂之後有「()」,而不是正常的「{}」。那些籃球確實出現在括號後面,那麼我將如何鑽出一把鑰匙呢?我對應用開發世界仍然陌生,所以我可能完全錯誤,只是這種請求方法在過去當我在第一個密鑰後收到「{}」時爲我工作。

+0

請勿發佈您的代碼圖片。將相關代碼作爲文本複製並粘貼到您的問題中。一定要正確格式化。 – rmaddy

回答

0

1)您正在使用方法valueForKeyPath()dictionary獲取值。 將其更改爲valueForKey()2)關鍵「預訂」的值將給你陣列。

試試看看這個代碼。

let data = JSON as! NSDictionary; 

//value for key "bookings" will give you array 
if let bookings = data.valueForKey("bookings") as? NSArray { 

    let bookingObj = bookings[0] as! NSDictionary; 

    self.address = bookingObj.valueForKey("address"); 
    self.state = bookingObj.valueForKey("state"); 
    self.zip = bookingObj.valueForKey("zip"); 
    self.city = bookingObj.valueForKey("city"); 
} 

FYI請注意,方法valueForKeyPath()返回的用於從詞典的陣列特定鍵值陣列。

例如假設你有預約陣列的多個對象,並使用

let arrayAddresses = bookings.valueForKeyPath("address") as! NSArray 

這將返回一個包含所有對象的唯一地址字符串數組。

另一點,'()'表示數組值,'{}'表示字典值。

0

我建議使用Swift類型(如[String: AnyObject])而不是基礎類型(比如NSDictionary),並且最重要的是,當某些事情失敗時應該打印出來,這樣你就知道什麼是錯的。所以從您的let data = ...行開始,試試這個來代替:

if let data = JSON as? [String: AnyObject], 
    bookings = data["bookings"] as? [[String: AnyObject]], 
    booking = bookings[0] { 

    self.address = booking["address"] as? String 
    self.state = booking["state"] as? String 
    self.zipCode = booking["zip"] as? String 
    self.city = booking["city"] as? String 

    print(self.address) 
} else { 
    print("Couldn't parse booking from JSON") 
} 

更多關於爲什麼打字是很重要的(爲什麼你應該使用的[[String: AnyObject]]代替NSArray)在this article。如果您使用適當的類型,您可以更具體,更簡潔。