如何解决JSON解析问题:“预期对Array <Any>进行解码,但找到了字典”
我在解析JSON时遇到错误。 我可以看到我的类型不匹配,但是我不确定如何解决它:
typeMismatch(Swift.Array,Swift.DecodingError.Context(codingPath:[],debugDescription:“预期对Array进行解码,但找到了一个字典。”,底层错误:无))
var dataModel = [Model]()
这是我的模特
import Foundation
struct Model: Codable {
let basepath: String
let items: [Item]
}
struct Item: Codable {
let title: String
let abstract: String
let thumbnail: String
}
这是我在其中解析JSON的根视图控制器。
import UIKit
class ViewController: UIViewController {
private let hostingView = UIView()
let cellID = "cell"
var dataModel = [Country]()
let tableView: UITableView = {
let table = UITableView()
table.rowHeight = 100
table.translatesAutoresizingMaskIntoConstraints = false
return table
}()
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.showSpinner(on: hostingView)
}
override func viewDidLoad() {
super.viewDidLoad()
configureView()
configureConstraints()
tableView.delegate = self
tableView.dataSource = self
tableView.register(TableViewCell.self,forCellReuseIdentifier: cellID)
performRequest()
}
private func configureView(){
view.backgroundColor = .white
title = "Game Of Thrones"
navigationController?.navigationBar.prefersLargeTitles = true
}
private func configureConstraints(){
view.addSubview(tableView)
tableView.topAnchor.constraint(equalTo: view.layoutMarginsGuide.topAnchor).isActive = true
tableView.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
tableView.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true
tableView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
}
private func performRequest(){
let url = "https://gameofthrones.fandom.com/api/v1/Articles/Top?expand=1&category=Articles&limit=75"
let urlString = URL(string: url)
guard urlString != nil else {return}
print(String("URL: \(urlString)"))
let session = URLSession(configuration: .default)
let dataTask = session.dataTask(with: urlString!) { (data,response,error) in
if error == nil && data != nil {
let decoder = JSONDecoder()
do {
let decodedData = try decoder.decode([Country].self,from: data!)
self.dataModel = decodedData
print(self.dataModel)
DispatchQueue.main.async {
self.removeSpinner()
self.tableView.reloadData()
}
} catch {
DispatchQueue.main.async {
print(error)
self.performRequestError()
}
}
}
}
dataTask.resume()
}
private func performRequestError(){
let ac = UIAlertController(title: "Error",message: "Cannot load data",preferredStyle: .alert)
ac.addAction(UIAlertAction(title: "OK",style: .default,handler: nil))
present(ac,animated: true)
}
}
extension ViewController: UITableViewDataSource,UITableViewDelegate {
func tableView(_ tableView: UITableView,numberOfRowsInSection section: Int) -> Int {
if dataModel.count > 0 {
// return dataModel[0].items.count
}
return 0
}
func tableView(_ tableView: UITableView,cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: cellID,for: indexPath) as! TableViewCell
cell.textLabel?.text = "title"
return cell
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。