如何在 Swift/Xcode 中解析来自 Google Places API 的 JSON "nearby search response"



Google Maps API运作良好,我得到了适当的JSON响应。但是,我在解析复杂且复杂的JSON响应时遇到困难,以获取所需的特定信息,例如位置名称。我基本上已经浏览了我能找到的每个YouTube教程和在线帖子,没有任何帮助。我包括了我正在使用的当前代码以及概述我得到的JSON响应的文档链接。任何帮助将不胜感激!

func nearbyLocations(latitude: Double, longitude: Double) {

    let jsonUrlString = "https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=(latitude),(longitude)&radius=25&key=..."
    guard let url = URL(string: jsonUrlString) else { return }
    URLSession.shared.dataTask(with: url) { (data, respone, err) in
        guard let data = data else { return }
        do {
            guard let json = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? [String: Any] else { return }
            print(json)
        } catch let jsonErr {
            print("json error:", jsonErr)
        }
    }.resume()
}

您可以正常解析:


if let results = json["results"] as! [[String:Any]], let firstResult = results.first {
    let geometry = firstResult["geometry"] as! [String:Any]
    let location = geometry["location"] as! [String:Any]
    let lat = location["lat"] as! Double
    let lng = location["lng"] as! Double
}

使用 Codable 解析 JSON响应

模型:

struct Root: Codable {
    var results: [SearchResult]
    var status: String
}
struct SearchResult: Codable {
    var id: String
    var icon: String
    var name: String
    var placeId: String
    var reference: String
    var types: [String]
    var vicinity: String
    var geometry: Geometry
    var photos: [Photo]
    var openingHours: [String:Bool]?
}
struct Geometry: Codable  {
    var location: Location
}
struct Location: Codable  {
    var lat: Double
    var lng: Double
}
struct Photo: Codable {
    var height: Double
    var width: Double
    var photoReference: String
}

在上面的模型中,根据您的要求添加keys。另外,以上任何keys都不确定API,将它们标记为optional

解析:

解析您在URLSession.shared.dataTask中获得的data,例如

do {
    let decoder = JSONDecoder()
    decoder.keyDecodingStrategy = .convertFromSnakeCase
    let root = try decoder.decode(Root.self, from: data)
    print(root)
} catch {
    print(error)
}

用法:

对于您提供的链接中的示例JSON响应,您可以使用 root oke

访问响应的属性
root.status //OK
root.results.first?.name //Rhythmboat Cruises
root.results.first?.geometry.location.lat //-33.870775

阅读有关Codable及其在此工作的更多信息。

最新更新