无法从 JSONDecoder 获取数据,没错,是我编的结构?

Posted

技术标签:

【中文标题】无法从 JSONDecoder 获取数据,没错,是我编的结构?【英文标题】:Unable to get data from JSONDecoder ,that's right, I made up the structure? 【发布时间】:2019-05-29 16:59:57 【问题描述】:

我有这样的结构,我拿了一块来获取数据。这是我的代码。为什么我不能从 Api 获取数据?任何人都可以帮助并在答案中写示例。看起来一切都是正确的。我将不胜感激。

[
    "id": 142636,
    "apiId": 353056,
    "shortName": "K. McKenzie-Lyle",
    "firstName": "Kai",
    "middleName": null,
    "lastName": "McKenzie-Lyle",
    "imageFileName": null,
    "height": 195,
    "weight": 86,
    "birthDate": "1997-11-30T00:00:00",
    "contractExpiration": null,
    "onLoanSquadTillDate": null,
    "oldApiId": 344534,
    "age": 22,
    "birthAreaId": 80,
    "passportAreaId": 110,
    "footName": "Right",
    "male": true,
    "currentSquadId": 20401,
    "parentSquadId": 46,
    "nationalSquadId": 31885,

    ]

我的代码结构尝试了 decode 和 "id" 等。

struct PlayerRoster:Codable 
    let id: String?
    let apiId:String?
    let shortName: String?
    let firstName: String?
    let middleName:String?
    let lastName:String?
    let imageFileName:String?
    let height:Double?
    let weight:Double?



我的加载 url api 地址。

func loadingApi()
            let urlData = "https://apidev.transferroom.com/api/values"

            guard let url = URL(string: urlData) else  return 

            let task = URLSession.shared.dataTask(with: url)  (data,response,error) in


                guard let data = data else  return 
                guard error == nil else return


                    do 
                        let decoder = JSONDecoder()

                        //using the array to put values
                      let player = try decoder.decode(PlayerRoster.self, from: data)
                      self.updatedPlauers = player




                     catch let error as NSError 
                        print("Failed to load: \(error.localizedDescription)")
                    
                


            task.resume()

        
    

【问题讨论】:

一些注意事项:id 和 apiId 是整数,而不是字符串。不要让所有属性都是可选的,只有那些实际上可能为空的。打印error 对象而不是localizedDescription,它包含更多信息print(error) 【参考方案1】:

你需要

let player = try decoder.decode([PlayerRoster].self, from: data)

您的 json 的根是由 [] 指示的数组,这样做有助于了解问题

 catch 
   print("Failed to decode : \(error)")
 

let id: Int?
let apiId:Int?        

【讨论】:

以上是关于无法从 JSONDecoder 获取数据,没错,是我编的结构?的主要内容,如果未能解决你的问题,请参考以下文章

Swift 5:如何从 JSONDecoder().decode 获取数据?

如何使用 JSONDecoder 根据订单键获取排序数据?

Swift - 使用 JSONDecoder 解码 JSON 数据

JSONDecoder 无法处理空响应

无法使用 JSONDecoder 返回或解码数据

Swift 4:JSONDecoder 在一种特定情况下失败-“操作无法完成”[关闭]