无法从tableview

时间:2018-03-05 11:53:28

标签: json swift codable

我正试图从the following API提取汽车信息。 但我似乎无法在我的tableview中显示信息...... 任何和所有的帮助表示赞赏!

的viewController

var hondaList: [HondaModel] = []
override func viewDidLoad() {
    //let jsonUrl = "https://api.myjson.com/bins/149ex5"
    let url = URL(string: "https://api.myjson.com/bins/149ex5")

    URLSession.shared.dataTask(with: url!) { (data, urlrespone , error) in
        do{
            try self.hondaList = JSONDecoder().decode([HondaModel].self, from: data!)
            for honda in self.hondaList {
                print(honda.name)
            }
            DispatchQueue.main.async {
                self.tableView.reloadData()
            }
        } catch{  
            print( "Error in fectching from https://api.myjson.com/bins/149ex5")
        }
    }.resume()
    super.viewDidLoad()

}

模型

import Foundation
struct HondaModel: Decodable {
    let name: String
    let engine: String
    let transmission: String
    let ocolor: String
    let icolor: String
    let vin: String
}

2 个答案:

答案 0 :(得分:3)

这是一个非常常见的错误:您忽略了根对象(以及两个可能的错误)

添加此结构

struct Root : Decodable {  
    private enum CodingKeys: String, CodingKey { case results = "Results", message = "Message" }

    let results : [HondaModel]
    let message : String
}

并解码

if let error = error { print(error); return }
do {
    let root = try JSONDecoder().decode(Root.self, from: data!)
    self.hondaList = root.results
...  
请打印error而不是无意义的文字字符串。错误告诉你错误。

catch {
   print(error)
}

在你的情况下你会得到

  

&#34;预计会解码Array<Any>但会找到字典。&#34;

这是一个非常重要的提示。

答案 1 :(得分:0)

试试这个

 if let resultJSON = data?["Results"] as? [[String: Any]] {
                                                    do {
                                                        let _data = try JSONSerialization.data(withJSONObject: resultJSON, options: .prettyPrinted)
                                                        self.hondaList = try JSONDecoder().decode([HondaModel].self, from: _data)
                                                       // … same thing
           }
 }