我真的需要帮助解决我在尝试解析看起来像这样的JSON时遇到的问题: http://imgur.com/t39nUSv 它是一个阵列' []'在字典中,每个字典都有两个键/值对,如图所示。 这是我的代码,我不知道为什么它会在线崩溃
for location in JSON as! Dictionary<String, AnyObject>
以下是导致其崩溃的代码
func populateMapObjects() {
if populatingMapObjects {
return
}
populatingMapObjects = true
self.loadingIndicator.startAnimating()
Alamofire.request(GWNetworking.Router.MapObjects).responseJSON() { response in
if let JSON = response.result.value {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0)) {
if (JSON .isKindOfClass(NSArray)) {
for location in JSON as! Dictionary<String,AnyObject> {
if let issueLocation: IssueLocation = IssueLocation(locationName: "Center of the universe", campusName: "Queen's University", latitude: 44.22661586877309, longitude: -76.49380087852478, coordinate: CLLocationCoordinate2D(latitude: 44.22661586877309, longitude: -76.49380087852478)) {
var index = 0
if let locationName = JSON[index]["name"] as? String {
issueLocation.locationName = locationName
}
print(issueLocation.locationName)
if let latitude = JSON[index]["coordinates"]!![1] as? Double {
issueLocation.latitude = latitude
}
if let longitude = JSON[index]["coordinates"]!![0] as? Double {
issueLocation.longitude = longitude
}
issueLocation.coordinate = CLLocationCoordinate2D(latitude: issueLocation.latitude, longitude: issueLocation.longitude)
index++
self.mapObjects.addObject(issueLocation)
}
}
}
dispatch_async(dispatch_get_main_queue()) {
self.loadingIndicator.stopAnimating()
self.populatingMapObjects = false
}
}
}
}
}
我是否应该考虑每个&#34;层&#34;我真的很困惑。 JSON作为数组或字典,如果它应该是NSDictionary,Dictionary ..如果我应该使用索引或valueForKey ....我迷失了。有人请告诉我如何修复这个bug。 我对应用的其他部分使用相同的API,但此视图特别是获得了看起来不同的JSON,这就是我无法让代码工作的原因。
编辑1:将注释添加到地图视图的代码。
func loadObjectsIntoMapView() {
for mapObject in mapObjects {
let temporaryMapAnnotation = IssueLocation(locationName: mapObject.locationName, campusName: "Main Campus", latitude: mapObject.latitude, longitude: mapObject.longitude, coordinate: mapObject.coordinate)
if (temporaryMapAnnotation.longitude < -76.50921821594238) {
temporaryMapAnnotation.campusName = "West Campus"
}
self.mapView.addAnnotation(temporaryMapAnnotation)
}
}
答案 0 :(得分:4)
您的JSON是一个字典数组。你的问题就在这一行:
for location in JSON as! Dictionary<String,AnyObject> {
这应该是:
for location in JSON as! [Dictionary<String,AnyObject>] {
也可以写成:
for location in JSON as! [[String: AnyObject]] {
本案例中的演员表适用于JSON
;您没有强制转换从JSON数组中检索的对象。
执行此操作时,location
的类型为Dictionary<String,AnyObject>
(也称为[String: AnyObject]
)。
答案 1 :(得分:2)
我自己还在学习Swift的细节。
我的猜测是在这句话中:
for location in JSON as! Dictionary<String,AnyObject>
运算符优先级为:
for location in (JSON as! Dictionary<String,AnyObject>)
哪会迫使JSON成为字典,然后尝试对其内容进行for循环。
对我来说,你想要的是这样的:
let arrayOfDictionaries = JSON as! [Dictionary<String,AnyObject>]
for location in arrayOfDictionaries
这应该将您的JSON对象强制转换为具有特定类型的变量(类型为Dictionary<String,AnyObject>
的字典数组,然后在该数组中执行for循环。