Как проанализировать JSON «ответ на ближайший запрос поиска» из Google Places API в Swift / Xcode - PullRequest
0 голосов
/ 01 июля 2019

API Карт Google работает отлично, и я получаю соответствующий ответ 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()
}

Ответы [ 2 ]

0 голосов
/ 01 июля 2019

Используйте 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 like,

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 и о том, как оно работает здесь .

0 голосов
/ 01 июля 2019

Вы можете нормально разобрать как:


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
}
...