Ошибка: keyNotFound (CodingKeys (stringValue: "origin", intValue: nil), - PullRequest
0 голосов
/ 05 августа 2020

** Этот вопрос отражает исследовательские усилия; это полезно и понятно

Я создаю небольшое приложение для быстрой доставки собак с помощью DogsApi, и у меня возникают некоторые проблемы, пытаясь разобрать JSON. Я использовал следующую функцию для синтаксического анализа get и синтаксического анализа JSON.

Ниже мой viewController: **

import UIKit

class ViewController: UIViewController {
    
    @IBOutlet weak var tableView: UITableView!
    

    var dogs = [DogStats]()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        
        downloadJson {
            print("Successful")
        }
    }
    
    func downloadJson(completed: @escaping () -> ()) {
        if let url = URL(string: "https://raw.githubusercontent.com/DevTides/DogsApi/master/dogs.json") {
           URLSession.shared.dataTask(with: url) { data, response, error in
              if let data = data {
                 do {
                    let dogs = try JSONDecoder().decode([DogStats].self, from: data)
                    print(dogs)
                    DispatchQueue.main.async {
                       self.dogs   = dogs
                       self.tableView.reloadData()
                    }
                 } catch let error {
                   print(error)
                 }
              }
           }.resume()
        
    }
    }

}

ниже моя структура

import Foundation

struct DogStats:  Codable {
    let name: String
    let origin: String
    let breed_group: String!
    let life_span: String
    let temperament: String
}

Ошибка в отладчике

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

1 Ответ

1 голос
/ 05 августа 2020

origin, Brend_group, temperament не содержатся во всех ваших JSON объектах в ваших данных API. Итак, произошла ошибка разбора. Вы можете сделать их необязательными (например, let origin: String?). Вы также можете сделать все поля необязательными.

struct DogStats:  Codable {
    let name: String
    let origin: String?
    let breed_group: String?
    let life_span: String
    let temperament: String?
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...