Я пытаюсь получить данные с сервера SQL через службу WCF - PullRequest
0 голосов
/ 20 мая 2018
import UIKit

public struct student: Decodable {
    let id:Int
    let name:String
}

class ViewController: UIViewController {

    @IBAction func btnshow(_ sender: Any) {

        let link = "http://10.211.55.3/WcfService1/Service1.svc/GetData"
        guard let url = URL(string: link)else{
            print("error during connection")
            return
        }
        URLSession.shared.dataTask(with: url) { (data, response, error) in

            guard let data = data
                else{                    print("there is no data")
                return
            }
            do{
                let students = try JSONDecoder().decode(student.self, from: data)
                print(students)


            } catch{
                print("conversion error")
                print(error)
            }
        }.resume()            
    }
}

keyNotFound (CodingKeys (stringValue: "id", intValue: nil), Swift.DecodingError.Context (codingPath: [], debugDescription: "Нет значения, связанного с ключом CodingKeys (stringValue: \" id)\ ", intValue: nil) (\" id \ ").", underError: nil))

1 Ответ

0 голосов
/ 20 мая 2018

Ну, распечатанная ошибка довольно понятна.Полученные данные не отформатированы так, как вы ожидаете, и некоторые ключи отсутствуют (id), поэтому JSONDecoder() не может их декодировать.

Убедитесь, что полученный ответПравильно отформатированный перед попыткой его декодирования.

РЕДАКТИРОВАТЬ: Таким образом, увидев ваш комментарий, ваша модель не соответствует JSON, который вы получаете, она должна выглядеть примерно так:

import UIKit

public struct JsonStudent: Decodable {
    let students: [Student]

    enum CodingKeys: String, CodingKey {
        case students = "GetDataResult"
    }
}

public struct Student: Decodable {
    let id: Int
    let name: String
}

class ViewController: UIViewController {

    @IBAction func btnshow(_ sender: Any) {
        let link = "http://10.211.55.3/WcfService1/Service1.svc/GetData"

    guard let url = URL(string: link) else {
            print("error during connection")
            return
    }

    URLSession.shared.dataTask(with: url) { (data, response, error) in
            guard let data = data
                else {                    print("there is no data")
                return
            }
            do {
                let students = try JSONDecoder().decode(JsonStudent.self, from: data)
                print(students)
            } catch {
                print("conversion error")
                print(error)
            }
        }.resume()            
    }
}
...