在 Swift 3 中解析 JSON (CLLocationCoordinate2D)

Posted

技术标签:

【中文标题】在 Swift 3 中解析 JSON (CLLocationCoordinate2D)【英文标题】:Parsing JSON in Swift 3 (CLLocationCoordinate2D) 【发布时间】:2018-05-16 17:35:10 【问题描述】:

我正在尝试使用 Google Places ios API 解析 JSON 链接。当我打印坐标时,它显示为

CLLocationCoordinate2D(纬度:0.0,经度:0.0)

而不是该地点的实际坐标。我认为这可能是字典/对象问题,但我找不到解决方案。

下面是我的 JSON 解析代码:

func parseJsonData(data: NSData) -> [GymGooglePlace] 

    do 

        typealias JSONDictionary = [String:Any]

        if let parsedData = try JSONSerialization.jsonObject(with: data as Data) as? JSONDictionary, let gyms = parsedData["results"] as? [JSONDictionary] 

            for gym in gyms 

                var coordinate = CLLocationCoordinate2D()
                var latitude:CLLocationDegrees!
                var longitude:CLLocationDegrees!

                var maxWidth:Int!
                var photoReference:String!
                let photoURL:String!

                if let geometry = gym["geometry"] as? [JSONDictionary] 

                    for result in geometry 

                        if let locations = result["location"] as? [JSONDictionary] 

                            for location in locations 

                                latitude = location["lat"] as! CLLocationDegrees!
                                longitude = location["lng"] as! CLLocationDegrees!

                                coordinate.latitude = latitude
                                coordinate.longitude = longitude
                            
                        
                    
                

                if let photos = gym["photos"] as? [JSONDictionary] 

                    for photo in photos 

                        maxWidth = photo["width"] as! Int!
                        photoReference = photo["photo_reference"] as! String!
                    
                

                photoURL = "https://maps.googleapis.com/maps/api/place/photo?maxwidth=\(maxWidth!)&photoreference=\(photoReference!)&key=\(googleAPIKey)"

                print(photoURL)
                print(coordinate)
                print("spacespacespacespacespacespacespacespacespace")
            
        



     catch 
        print(error)
    

    return gymGooglePlaces

【问题讨论】:

你的 JSON 是什么样的?你确定你得到了实际的纬度和经度值,即结果[“位置”]实际上包含一些数据吗? 老实说,我曾经手动解析 JSON 有效负载,所以我不需要拉入任何 3rd 方库。但现在,我喜欢一些像 ObjectMapper 或 SwiftyJson 这样的 pod。所以当你的 JSON payload 结构发生变化时,你需要做的只是改变 keypath,而不是重写 parse 方法 【参考方案1】:

geometrylocation键的值是字典,请注意,数组是[]

 if let geometry = gym["geometry"] as? JSONDictionary,
    let location = geometry["location"] as? JSONDictionary 
         coordinate.latitude = location["lat"] as! CLLocationDegrees
         coordinate.longitude = location["lng"] as! CLLocationDegrees
 

【讨论】:

以上是关于在 Swift 3 中解析 JSON (CLLocationCoordinate2D)的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 3 中正确解析 JSON

在 Swift 3 中正确解析 JSON

如何使用 Alamofire 在 Swift 3 中解析 JSON?

使用 Alamofire 在 swift 3 中解析 Json

在 Swift 3 中解析 JSON,就像 Apple 的 Swift 2 示例一样

如何在 swift 3 中解析 JSON