无法将 json 对象转换为结构

Cannot convert json object to struct

我想将 json 从以下 url 转换为结构。但是,我收到错误 Could not cast value of type '__NSArrayI' to 'NSData'

这是示例 json 数据 https://jsonplaceholder.typicode.com/posts

的 url

这是结构

struct GetHelp: Codable {
    var id: Int
    var userId: Int
    var title: String
    var body: String
}

这里是服务器通信

AF.request("https://jsonplaceholder.typicode.com/posts")
       .responseJSON { response in

        switch response.result {
            case let .success(value):

                do {
                    let decoder = JSONDecoder()
                    let model = try decoder.decode([GetHelp].self, from: value as! Data)
                    print(model)
                } catch let parsingError {
                    print("Error", parsingError)
            }

            case let .failure(error): print(error)
        }

    }

此外,如果您删除value as! Data,则会出现以下错误。

Cannot convert value of type 'Any' to expected argument type 'Data'

我收到错误的原因是什么以及如何解决这个问题?

你必须通过 .responseData 而不是 .responseJSON 来获取原始数据,.responseJSON returns 一个集合类型。

AF.request("https://jsonplaceholder.typicode.com/posts")
       .responseData { response in

        switch response.result {
            case let .success(value):

                do {
                    let decoder = JSONDecoder()
                    let model = try decoder.decode([GetHelp].self, from: value)
                    print(model)
                } catch {
                    print("Error", error)
            }

            case let .failure(error): print(error)
        }

    }

要将字典数组与 .responseJSON 一起使用,您必须在代码中将数组映射到您的模型

AF.request("https://jsonplaceholder.typicode.com/posts")
       .responseJSON { response in

        switch response.result {
            case let .success(value):
                if let array = value as? [[String:Any]] {

                   let model = array.map { GetHelp(id: [=11=]["id"] as! Int,                  
                                                   userId: [=11=]["userId"] as! Int,
                                                   title: [=11=]["title"] as! String,
                                                   body: [=11=]["body"] as! String)}
                   print(model)   
                }

            case let .failure(error): print(error)
       }    
    }

即使使用 responseJSON 块,您也可以直接从响应中获取数据

request("https://jsonplaceholder.typicode.com/posts")
       .responseJSON { response in

        switch response.result {
            case let .success(value):

                do {
                    let decoder = JSONDecoder()
                    if let data = response.data {
                       let model = try decoder.decode([GetHelp].self, from: data)
                       print(model)
                   }
                } catch let parsingError {
                    print("Error", parsingError)
            }

            case let .failure(error): print(error)
        }

    }

无需在 Alamofire 5 中手动处理 Decodable 响应,您现在可以直接处理:

AF.request("https://jsonplaceholder.typicode.com/posts")
       .responseDecodable(of: GetHelp.self) { response in
            switch response.result {
            case let .success(value): print(value)
            case let .failure(error): print(error)
            }
        }