【发布时间】:2021-04-05 20:51:51
【问题描述】:
大家好,我总是收到以下错误,不知道如何解决。
typeMismatch(Swift.Array, Swift.DecodingError.Context(codingPath: [], debugDescription: "期望解码 Array 但找到了一个字典。", underlyingError: nil))
在 Swift 类 DataLoader.swift 中,我发出 URL 请求,我想将 json 文件解析为 Struct TaskData.swift 中的 Objekt。然后我将这些对象保存到列表 userData。
我想在表格视图中显示此对象的特定值。
但是当我制作这个 try decoder.decode([TaskData].self, from: data)
时,我变成了 Swift 解码错误我做错了什么以及如何让它发挥作用?
{
"result": [
{
"complexity": 3,
"deadline": "2020-12-10",
"description": "This is Task 1",
"priority": "A",
"state": "In Progress",
"title": "Task 1"
},
{
"complexity": 3,
"deadline": "2020-12-10",
"description": "This is Task 2",
"priority": "A",
"state": "In Progress",
"title": "Task 2"
},
{
"complexity": 3,
"deadline": "2020-12-10",
"description": "This is Task 3",
"priority": "A",
"state": "In Progress",
"title": "Task 3"
},
{
"complexity": 3,
"deadline": "2020-12-10",
"description": "This is Task 4",
"priority": "A",
"state": "In Progress",
"title": "Task 4"
}
]
}
import Foundation
struct TaskData: Codable {
let complexity: String
let deadline: String
let description: String
let priority: String
let state: String
let title: String
init(title: String?, state: String?, priority: String?, description: String?,
deadline: String?, complexity: String?) {
self.title = title ?? ""
self.state = state ?? ""
self.priority = priority ?? ""
self.description = description ?? ""
self.deadline = deadline ?? ""
self.complexity = complexity ?? ""
}
}
import Foundation
public class DataLoader {
@Published var userData = [TaskData]()
init() {
load()
}
func load() {
// Create URL
let url = URL(string: "http://xx.xxx.xx.xxx:443/get")
guard let requestUrl = url else { fatalError() }
// Create URL Request
var request = URLRequest(url: requestUrl)
// Specify HTTP Method to use
request.httpMethod = "GET"
// Send HTTP Request
let task = URLSession.shared.dataTask(with: request) { (data, response, error) in
// Check if Error took place
if let error = error {
print("Error took place \(error)")
return
}
// Read HTTP Response Status code
if let response = response as? HTTPURLResponse {
print("Response HTTP Status code: \(response.statusCode)")
}
// Convert HTTP Response Data to a simple String
if let data = data, let dataString = String(data: data, encoding: .utf8) {
print("Response data string:\n \(dataString)")
let decoder = JSONDecoder()
do {
let taskItem = try decoder.decode([TaskData].self, from: data)
self.userData = taskItem
} catch {
print(error)
}
}
}
task.resume()
}
}
【问题讨论】: