无法从tableview中的URL解析JSON

问题描述 投票:-1回答:2

我想从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
}
json swift codable
2个回答
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)
}

在你的情况下,你会得到

“预计会解码Array<Any>,但却发现了字典。”

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


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
           }
 } 
© www.soinside.com 2019 - 2024. All rights reserved.