Разбор JSON из URL заканчивается ошибкой - Swift 5 - PullRequest
2 голосов
/ 05 мая 2020

Я пытаюсь быстро написать функцию, которая получает данные из URL JSON и быстро распределяет их по переменным.

Это функция:

func getBikeData(){
    guard let url = URL(string: "https://api.citybik.es//v2/networks/baksi-bisim") else {return}
    let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
    guard let dataResponse = data,
              error == nil else {
              print(error?.localizedDescription ?? "Response Error")
              return }
        do{
            //here dataResponse received from a network request
            let jsonResponse = try JSONSerialization.jsonObject(with:
                                   dataResponse, options: [])
            print(jsonResponse) //Response result


            do {
                //here dataResponse received from a network request
                let decoder = JSONDecoder()
                //Decode JSON Response Data

                let model = try decoder.decode(Station.self,
                                               from: dataResponse)
                print(model.freeBikes) //Output - 1221

            } catch let parsingError {
                print("Error", parsingError)
            }
         } catch let parsingError {
            print("Error", parsingError)

       }
    }
    task.resume()

}

Это структура, которую я добавил, с необходимыми мне данными:

    // MARK: - Station
struct Station: Codable {
    let emptySlots: Int
    let extra: Extra
    let freeBikes: Int
    let id: String
    let latitude, longitude: Double
    let name, timestamp: String

    enum CodingKeys: String, CodingKey {
        case emptySlots
        case extra
        case freeBikes
        case id, latitude, longitude, name, timestamp
    }
}

// MARK: - Extra
struct Extra: Codable {
    let slots: Int
    let status: Status
    let uid: String
}

enum Status: String, Codable {
    case active = "Active"
}

Это ошибка, которую я получаю:

Error keyNotFound(CodingKeys(stringValue: "emptySlots", intValue: nil), Swift.DecodingError.Context(codingPath: [], debugDescription: "No value associated with key CodingKeys(stringValue: \"emptySlots\", intValue: nil) (\"emptySlots\").", underlyingError: nil))

Это первый раз, когда я работал с файл JSON, и, возможно, мне не хватает чего-то очень простого. Пожалуйста помоги.

Ответы [ 2 ]

1 голос
/ 05 мая 2020
Error keyNotFound(CodingKeys(stringValue: "emptySlots", intValue: nil), Swift.DecodingError.Context(codingPath: [], debugDescription: "No value associated with key CodingKeys(stringValue: \"emptySlots\", intValue: nil) (\"emptySlots\").", underlyingError: nil))

Вышеупомянутая ошибка возникает, если вы пытаетесь декодировать объект JSON, у которого нет этого ключа, и этот ключ не отмечен как необязательный.

Вы можете либо исправить сервер, чтобы возвращался emptySlots, либо пометить emptySlots как необязательный в своей структуре:

struct Station: Codable {
    let emptySlots: Int?
1 голос
/ 05 мая 2020

Вот как декодировать все данные json в быструю структуру:

import Foundation


struct Stations: Codable {
    let company: [String]
    let href: String
    let id: String
    let location: LocationJson
    let name: String
    let stations: [Station]

}


struct Station: Codable {
    let empty_slots: Int
    let extra: Extra
    let free_bikes: Int
    let id: String
    let latitude: Double
    let longitude: Double
    let name: String
    let timestamp: String

}

struct ResponseJSON: Codable {
    let network: Stations
}

struct LocationJson: Codable {
    let city: String
    let country: String
    let latitude: Double
    let longitude: Double
}


struct Extra: Codable {
    let slots: Int
    let status: String
    let uid: String
}


func getBikeData(){
    guard let url = URL(
        string: "https://api.citybik.es//v2/networks/baksi-bisim"
    ) else { return }

    let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
        guard let dataResponse = data, error == nil else {
            print(error?.localizedDescription ?? "Response Error")
            return
        }
        do {
            //here dataResponse received from a network request
            let jsonResponse = try JSONSerialization.jsonObject(with:
                                   dataResponse, options: [])
            print(jsonResponse) //Response result


            do {
                //here dataResponse received from a network request
                let decoder = JSONDecoder()
                //Decode JSON Response Data

                let model = try decoder.decode(
                    ResponseJSON.self, from: dataResponse
                )
                print(model) //Output - 1221

            } catch let parsingError {
                print("Error", parsingError)
            }

         } catch let parsingError {
            print("Error", parsingError)
         }
    }
    task.resume()

}

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