Разбор данных JSON swift - PullRequest
       0

Разбор данных JSON swift

0 голосов
/ 28 ноября 2018

Я пытаюсь разобрать долготу и широту лондонского глаза.Мой код выглядит следующим образом:

Вот мой класс:

struct Location: Decodable{
    let location: String
    let lat: Double
    let long: Double

}

Вот моя функция

func getData(){
        let url = "URL FOR THE JSON"
        let urlOBJ = URL(string: url)

        URLSession.shared.dataTask(with: urlOBJ!){(data,response,errror) in

            do{
                let locations = try JSONDecoder().decode([Location].self, from: data!)

                for x in locations{
                    print(x.lat)
                }
            }

            catch{
                print("We got an error")
            }

    }.resume()

Вот мой ответ JSON:

{
   "results" : [
      {
         "address_components" : [
            {
               "long_name" : "918",
               "short_name" : "918",
               "types" : [ "street_number" ]
            },
            {
               "long_name" : "12th Street",
               "short_name" : "12th St",
               "types" : [ "route" ]
            },
            {
               "long_name" : "New Westminster",
               "short_name" : "New Westminster",
               "types" : [ "locality", "political" ]
            },
            {
               "long_name" : "Greater Vancouver",
               "short_name" : "Greater Vancouver",
               "types" : [ "administrative_area_level_2", "political" ]
            },
            {
               "long_name" : "British Columbia",
               "short_name" : "BC",
               "types" : [ "administrative_area_level_1", "political" ]
            },
            {
               "long_name" : "Canada",
               "short_name" : "CA",
               "types" : [ "country", "political" ]
            },
            {
               "long_name" : "V3M 6B1",
               "short_name" : "V3M 6B1",
               "types" : [ "postal_code" ]
            }
         ],
         "formatted_address" : "918 12th St, New Westminster, BC V3M 6B1, Canada",
         "geometry" : {
            "location" : {
               "lat" : 49.2122785,
               "lng" : -122.9368196
            },
            "location_type" : "ROOFTOP",
            "viewport" : {
               "northeast" : {
                  "lat" : 49.21362748029149,
                  "lng" : -122.9354706197085
               },
               "southwest" : {
                  "lat" : 49.21092951970849,
                  "lng" : -122.9381685802915
               }
            }
         },
         "place_id" : "ChIJt0rd0NB3hlQRWKnWCK79k1s",
         "plus_code" : {
            "compound_code" : "6367+W7 New Westminster, British Columbia, Canada",
            "global_code" : "84XV6367+W7"
         },
         "types" : [ "doctor", "establishment", "health", "point_of_interest" ]
      }
   ],
   "status" : "OK"
}

Я хочу извлечь местоположение из геометрического раздела ответа, но думаю, что я неправильно понял, как туда добраться.Любая помощь приветствуется, поскольку я новичок в этом.

Когда я запускаю это, я перенаправляюсь на свое сообщение об ошибке, поэтому я думаю, что он просто не находит долготу или широту.

Пожалуйста, спросите, еслиу вас есть какие-либо вопросы относительно моего кода.

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

Итак, начнем с необработанного ответа.У вас есть корень - results, а затем у вас есть узел geometry с location подузлом.

1.Мы будем использовать протокол Codable для упрощения анализа:

struct RawResponseRoot: Codable {
    let results: [RawResponse]
}

struct RawResponse: Codable {

    struct Geometry: Codable {
        let location: Location
    }

    struct Location: Codable {
        private enum CodingKeys: String, CodingKey {
            case latitude = "lat", longitude = "lng"
        }
        let latitude: Double
        let longitude: Double
    }

    let name: String
    let geometry: Geometry
}

2.Создайте структуру Venue для хранения вашего местоположения и названия местоположения:

struct Venue: Codable {
    let name: String
    let latitude: Double
    let longitude: Double

    init(from rawResponse: RawResponse) throws {
        self.name = rawResponse.name
        self.latitude = rawResponse.geometry.location.latitude
        self.longitude = rawResponse.geometry.location.longitude
    }
}

3.Затем в вашей функции getData извлеките результаты:

func getData(){
    let url = "URL FOR THE JSON"
    let urlOBJ = URL(string: url)

    URLSession.shared.dataTask(with: urlOBJ!){(data,response,error) in
          guard let data = data, let root = try? JSONDecoder().decode(RawVenueResponseRoot.self, from: data) else {
              print("Error retrieving data:", error)
              return
          }

        let locations = root.results.compactMap({ try? Venue(from: $0) })

}.resume()
0 голосов
/ 28 ноября 2018

Я думаю, что вы должны пройти некоторые базовые учебные пособия.Вы делаете много ошибок.Например, структура вашего местоположения отличается от структуры JSON.В JSON ключ долготы - «lng», но в вашей структуре - «длинный».

Пройдите через это

https://benscheirman.com/2017/06/swift-json/

Он охватывает основыа также много разных вариантов использования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...