无法读取数据,因为它的格式不正确

The data couldn't be read because it isn't in the correct format

您好,我正在使用 Xcode 创建一个应用程序,我遇到了以下问题,我使用 mockapi.io 创建了这个 API (如果您输入 link将看到 JSON 数据)https://62858a2ff0e8f0bb7c057f14.mockapi.io/categorias

如果您不想输入 link,这里是 JSON 的样子:(默认情况下,JSON 有一个没有名称的数组作为根,并且可以' t被修改)

[
   {
      "categorie":"Fruits",
      "id":"1"
   },
   {
      "categorie":"Animals",
      "id":"2"
   },
   {
      "categorie":"Vegetables",
      "id":"3"
   },
   {
      "categorie":"Juices",
      "id":"4"
   },
   {
      "categorie":"Alcohol",
      "id":"5"
   },
   {
      "categorie":"Desserts",
      "id":"6"
   }
]

我遇到的问题是,当我尝试解码来自 API 的数据时,由于格式错误而无法读取,我正在尝试重新创建与此 youtube 视频相同的代码, 但是我的 API: https://www.youtube.com/watch?v=sqo844saoC4

我的代码是这样的:

import UIKit
class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        let url = "https://62858a2ff0e8f0bb7c057f14.mockapi.io/categorias"
        getData(from: url)
    } 
    private func getData(from url: String) {   
        let task = URLSession.shared.dataTask(with: URL(string: url)!, completionHandler: { data, response, error in
            guard let data = data, error == nil else {
                print("something went wrong")
                return
            }   
            var result: Response?
            do {
                result = try JSONDecoder().decode(Response.self, from: data)
            }
            catch {
                print("failed to convert\(error.localizedDescription)")
            }      
            guard let json = result else {
                return
            } 
            print(json.items.categorie) //  HERE ES WHERE THE PRINT HAPPENS
        })
            task.resume()
    }
}
//  I THINK THE PROBLEM IS DEFINITELY HERE
struct Response: Codable {
    let items: ResultItem
}
struct ResultItem: Codable {
    let categorie: String
}

当我执行此命令时,终端打印:“无法读取数据,因为它的格式不正确。”

我很确定错误来自于我在结构中调用数据的方式,所以我的问题是......?我怎样才能在代码中准确地调用我的 API 的 JSON 中的数据?

您得到的响应是一个 ResultItem 数组而不是单个对象,因此您需要将其解码为一个数组:

result = try JSONDecoder().decode(Array<ResultItem>.self, from: data)

也就是说,您根本不需要 Response 结构,result 的类型将是 [ResultItem].

是的,你的模型有问题你不需要使用(响应)只使用模型(ResultItem) JSON 并不复杂 JSON 就像它只是 (ResultItem)

数组
private func getData(from url: String) {
let task = URLSession.shared.dataTask(with: URL(string: url)!, completionHandler: { data, response, error in
    guard let data = data, error == nil else {
        print("something went wrong")
        return
    }
    do {
        let result = try JSONDecoder().decode([ResultItem].self, from: data)
        print(result)
    }
    catch {
        print("failed to convert\(error.localizedDescription)")
    }

})
    task.resume()
 }

struct ResultItem: Codable {
let categorie: String
}