无法用json解析Divvy自行车数据

时间:2017-11-18 15:24:07

标签: ios json swift parsing swift3

我试图解析以下链接中的一些数据:https://feeds.divvybikes.com/stations/stations.json

       func getData() {

        let url = URL(string:"https://feeds.divvybikes.com/stations/stations.json")

        // Submit a request
        let task = URLSession.shared.dataTask(with: url!) { (data,response,error) in

            // print error if there is one
            if error != nil {
                print(error!)
                self.alert(messageTitle: "Error", messageM: "An error occured")
                return
            } // end if

            // if there is no error, fetch the json
            if let content = data {
                do {

                    let json = try JSONSerialization.jsonObject(with: content, options:JSONSerialization.ReadingOptions.mutableContainers ) as AnyObject

                    if let stationName = json["stationBeanList"] as? [String: AnyObject] {
                        for station in stationName{
                            if let  lat1 = ["latitude"] as? CGFloat, let long1 = ["longitude"] as? CGFloat{


                                print(lat1,long1)
                            }
                        }


                        }

                }








                catch {
                    print(error)
                    self.alert(messageTitle: "Error", messageM: "An error occured")
                }
            }//end if
    }//end task
        task.resume()

//endqueue   
}

我想从上面的链接中获取经度和纬度,并将它们绘制在嵌入swift的mapview中,但我似乎无法获得打印或存储的经度和纬度。任何帮助将不胜感激。

我在load()上调用getData函数  运行应用程序时,调试器中没有显示任何内容。

4 个答案:

答案 0 :(得分:0)

在查看完代码之后,我发现你在网络服务的调用中犯了一个很小的错误。

如果您想获取值,则需要在for loop stationName之后按照此处进行操作。 以下是示例摘要以获得更多说明。

for station in stationName{
    print(station["latitude"] as! Double)
    print(station["longitude"] as! Double)
}

希望这可以帮助你:)

答案 1 :(得分:0)

在代码中,您将纬度和经度视为String。但它的值不是String类型。

所以永远不会调用print(lat1,long1)

解决方案:将其视为CGFloat而不是String,它会起作用我认为是

答案 2 :(得分:0)

让url =网址(字符串:" https://feeds.divvybikes.com/stations/stations.json")

        // Submit a request to get the JASON data
        let task = URLSession.shared.dataTask(with: url!) { (data,response,error) in

            // if there is an error, print the error and do not continue
            if error != nil {
                print(error!)
                self.alert(messageTitle: "Error", messageM: "An error occured")
                return
            } // end if

            // if there is no error, fetch the json formatted content
            if let content = data {
                do {

                    let jsonObject = try JSONSerialization.jsonObject(with: content, options: [] ) as AnyObject

                    if let JSON = jsonObject["stationBeanList"] as? [[String:AnyObject]] {
                        for stationInfo in JSON {

                            if let longitude = stationInfo["longitude"] as? Float64, let latitude = stationInfo["latitude"] as? Float64                                    {
                                print(longitude,latitude)



                                    //      self.objects.append(stationInfo(latitude:latitude,longitude:longitude))
                            }//end if
                        }//end if let
                    }//end do


                }//end do
                catch {
                    print(error)
                    self.alert(messageTitle: "Error", messageM: "An error occured")
                }
            }//end if
        }//end task
        task.resume()
    }//endqueue
}

答案 3 :(得分:0)

有很多问题。

  • 主要问题是if (x > 5) { } else if (x > 50) { } else { } 的值是数组而非字典
  • stationBeanList在Swift中完全没用,省略了参数。
  • Swift 3+ JSON字典为.mutableContainers,数组为[String:Any]
  • Swift 3+中未指定的JSON类型为[[String:Any]],从不Any
  • 标准JSON浮点值为AnyObject
  • 如果期望的类型更具体,则永远不要将JSON结果转换为Double
Any