我正在使用DogsApi构建一个小型的swift dog fetch应用程序,并且在尝试解析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”)。“,底层错误:nil))
答案 0 :(得分:1)
起源,品种组,气质未包含在API数据中的所有JSON对象中。因此出现了解析错误。您可以将其设为可选(即让origin:String?)。您还可以将所有字段设为可选。
struct DogStats: Codable {
let name: String
let origin: String?
let breed_group: String?
let life_span: String
let temperament: String?
}