Google Maps API运作良好,并且我得到了适当的JSON响应。但是,我在解析复杂而复杂的JSON响应时遇到了麻烦,以便获取所需的特定信息,例如位置名称。我基本上遍历了所有可以找到的YouTube教程和在线帖子,但没有任何帮助。我已经包含了我正在使用的当前代码以及指向概述我所得到的JSON响应的文档的链接。任何帮助将不胜感激!
https://developers.google.com/places/web-service/search#nearby-search-and-text-search-responses
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()
}
答案 0 :(得分:0)
您可以解析法线,例如:
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
}
答案 1 :(得分:0)
使用 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
。
解析:
按如下方式解析您在data
中获得的URLSession.shared.dataTask
,
do {
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
let root = try decoder.decode(Root.self, from: data)
print(root)
} catch {
print(error)
}
用法:
对于您提供的链接中的示例JSON响应,您可以使用root
来访问响应的属性,
root.status //OK
root.results.first?.name //Rhythmboat Cruises
root.results.first?.geometry.location.lat //-33.870775
详细了解Codable
及其工作原理here。