我想用 pokeapi 制作一個包含口袋妖怪的迷你應用程式。
我在決議這個特定的 JSON 時遇到了很多問題,資料沒有出現在 TableView 中。
這是網站:https ://pokeapi.co/docs/v2#info
在新聞控制臺中: typeMismatch(Swift.Array, Swift.DecodingError.Context(codingPath: [], debugDescription: "期望解碼 Array 但找到了一個字典。",底層錯誤: nil))
下面是我的代碼:
資料管理器.swift
import UIKit
protocol DataManagerDelegate {
func didUpdateStruct(_ dataManager: DataManager, dataModel: [DataModel])
func didFailWithError(error: Error)
}
struct DataManager {
let baseURL = "https://pokeapi.co/api/v2/pokemon"
var delegate: DataManagerDelegate?
func fetchUrl() {
let urlString = "\(baseURL)"
performRequest(with: urlString)
}
func performRequest(with urlString: String) {
if let url = URL(string: urlString) {
let session = URLSession(configuration: .default)
let task = session.dataTask(with: url) { (data, response, error) in
if error != nil {
self.delegate?.didFailWithError(error: error!)
return
}
if let safeData = data {
if let pokemons = self.parseJSON(safeData) {
self.delegate?.didUpdateStruct(self, dataModel: pokemons)
}
}
}
task.resume()
}
}
func parseJSON(_ dataModel: Data) -> [DataModel]? {
let decoder = JSONDecoder()
do {
let decodedData = try decoder.decode([DataModel].self, from: dataModel)
return decodedData
} catch {
delegate?.didFailWithError(error: error)
return nil
}
}
}
資料模型.swift
import UIKit
struct DataModel: Codable {
let results: [Results]
}
struct Results: Codable {
let name: String?
}
uj5u.com熱心網友回復:
錯誤很明顯。codingPath: []告訴您在根物件處決議失敗。[DataModel]當您應該只解碼時,您正在嘗試解碼陣列DataModel:
let decodedData = try decoder.decode(DataModel.self, from: dataModel)
我還建議更好地命名您的資料模型,例如:
struct PokemonList: Codable {
let results: [Pokemon]
}
struct Pokemon: Codable {
let name: String?
}
那么很明顯你想要決議 aPokemonList并只回傳 pokemons 陣列:
func parseJSON(_ data: Data) -> [Pokemon]? {
let decoder = JSONDecoder()
do {
let decodedData = try decoder.decode(PokemonList.self, from: data)
return decodedData.results
} catch {
delegate?.didFailWithError(error: error)
return nil
}
}
uj5u.com熱心網友回復:
您得到的回應是作為根物件的字典,而您正在使用陣列對其進行解碼。請替換
let decodedData = try decoder.decode([DataModel].self, from: dataModel)為
let decodedData = try decoder.decode(DataModel.self, from: dataModel)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/426799.html
上一篇:為什么.NET的System.Text.Json.JsonSerializer.Deserialize方法的回傳型別在不回傳null時可以為null?
