我是JSON feed和Swift 4的新手。我在从嵌套JSON提要中打印数据时遇到问题。首先,我不确定我是否在do语句中正确调用了数组。其次,在构建应用程序时,出现以下长时间错误。有人可以帮我破译吗?我的代码在帖子的底部。先感谢您。
2017-12-06 12:58:48.604154-0500 PlayerRankDOTA2 [91584:6694163] [BoringSSL]函数boringssl_context_get_peer_sct_list:1754行收到的sct扩展长度小于sct数据长度
错误jsonErr dataCorrupted(Swift.DecodingError.Context(codingPath:[PlayerRankDOTA2.PlayerStatsParent。(_ 053A446F694D6B16CE13A0E302B3B14A中的CodingKeys).. PlayerStats。(_ 053A446F694D6B16CE13A0E302B3B14A中的CodingKeys)。debugDescription:“已解析的JSON号不适合Int。”,underlyingError:nil))
import UIKit
struct PlayerStatsParent:Decodable{
let rankings: [PlayerStats]
}
struct PlayerStats:Decodable {
let personaname: String
let score: Int
let solo_competitive_rank: Int
let avatar: String
}
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let jsonUrlString = "https://api.opendota.com/api/rankings"
guard let url = URL(string: jsonUrlString) else {return}
URLSession.shared.dataTask(with: url) { (data, response, error) in
guard let data = data else {return}
//let dataAsString = String(data: data, encoding: .utf8)
//print(dataAsString)
do{
let playerStatsParent = try JSONDecoder().decode(PlayerStatsParent.self, from: data)
print(playerStatsParent.rankings)
} catch let jsonErr {
print("Error jsonErr", jsonErr)
}
}.resume()
}
let jsonUrlString = "https://api.opendota.com/api/rankings"
}
最佳答案
您必须对PlayerStats
进行一些更改。首先,score
必须为Double
,因为这是API返回的格式。其次,所有值都可以在JSON响应中为null
。解决此问题的一种方法是将所有属性定义为可选属性。
struct PlayerStats:Decodable {
let personaname: String?
let score: Double?
let solo_competitive_rank: Int?
let avatar: String?
}
将
PlayerStats
结构更改为上述格式后,解码工作正常。