好的,我很难深入研究下面代码中检索到的响应json。
快照1:
快照2:
我将上面的json作为回应,但当我尝试深入json时,我无法访问密钥" Address"或根据预订持有的任何其他钥匙。它找到预订但随后分配我为每个键的值(地址,州,邮政编码和城市)创建的变量,并将这些变量指定为空。我唯一的理论是响应json有"()"在预订之后而不是正常的" {}"。那些大括号确实出现在括号之后,那么如何用一把钥匙钻进去?我仍然是应用程序开发世界的新手,所以我可能完全错了,只是这种请求方法在我过去收到了#34; {}"在第一把钥匙之后。
答案 0 :(得分: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()
会返回字典数组中特定键的值数组。
e.g。假设您有多个预订数组对象,并使用
let arrayAddresses = bookings.valueForKeyPath("address") as! NSArray
这将返回仅包含所有对象地址的字符串数组。
另一点,'()'表示数组值,' {}'表示字典值。
答案 1 :(得分: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")
}
更多关于为什么在this article中输入很重要(以及为什么应该使用[[String: AnyObject]]
代替NSArray
)的原因。如果使用正确的类型,您可以更具体,更简洁。