【问题标题】:Swift Json Parse Error (Swift.DecodingError.Context)Swift Json 解析错误 (Swift.DecodingError.Context)
【发布时间】: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()
    }
}

【问题讨论】:

标签: ios arrays json swift


【解决方案1】:

你的根是字典而不是数组,所以添加

struct Root : Codable {
  let result: [TaskData]
}

然后

let res = try decoder.decode(Result.self, from: data)m 
self.userData = res.result

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 2016-02-24
    相关资源
    最近更新 更多