【发布时间】:2019-12-06 03:55:34
【问题描述】:
我想获取一些 JSON 数据。我做了一个结构,但这个结构似乎不起作用。当我运行我的代码时,我会收到这个错误:
typeMismatch(Swift.Int, Swift.DecodingError.Context(codingPath: [CodingKeys(stringValue: "data", intValue: nil), CodingKeys(stringValue: "match", intValue: nil), _JSONKey(stringValue: "Index 0", intValue: 0), CodingKeys(stringValue: "time", intValue: nil)], debugDescription: "期望解码 Int 但找到了一个字符串/数据。",底层错误: nil))
我是 JSON 和 Struct 的新手,所以我不明白我做错了什么。我在互联网上搜索过类似的问题,但他们的解决方案似乎对我不起作用。 结构:
struct Data: Codable {
var data: Match
init(data: Match) {
self.data = data
}
}
struct Match: Codable {
var match: [Live_Match]
init(match: [Live_Match]) {
self.match = match
}
}
struct Live_Match: Codable {
let competition_id: Int?
let status: String?
let ht_score: String?
let ft_score: String?
let et_score: String?
let league_name: String?
let away_id: Int?
let score: String?
let competition_name: String?
let home_id: Int?
let away_name: String?
let time: Int?
let home_name: String?
let league_id: Int?
init(competition_id: Int?, status: String?, ht_score: String?, ft_score: String?, et_score: String?, league_name: String?, away_id: Int?, score: String?, competition_name: String?, home_id: Int?, away_name: String?, time: Int?, home_name: String?, league_id: Int?) {
self.competition_id = competition_id
self.status = status
self.ht_score = ht_score
self.ft_score = ft_score
self.et_score = et_score
self.league_name = league_name
self.away_id = away_id
self.score = score
self.competition_name = competition_name
self.home_id = home_id
self.away_name = away_name
self.time = time
self.home_name = home_name
self.league_id = league_id
}
}
获取函数:
final let url_live = URL(string:"http://livescore-api.com/api-client/scores/live.json?key=6iNDEUYbh6NZHBdG&secret=RxkjBBp4h7MoKw2ROQvtLtE3zs2h4fXV&country=2")
private var Live_Matches = [Live_Match]()
func downloadJson() {
guard let downloadURL = url_live else { return }
URLSession.shared.dataTask(with: downloadURL) { data, urlResponse, error in
guard let data = data, error == nil, urlResponse != nil else {
print(error?.localizedDescription)
return
}
print("downloaded")
do
{
let decoder = JSONDecoder()
let downloadedLive_Matches = try decoder.decode(Data.self, from: data)
print(downloadedLive_Matches)
self.Live_Matches = downloadedLive_Matches.data.match
DispatchQueue.main.async {
self.tableView.reloadData()
}
} catch {
print(error.localizedDescription)
}
}.resume()
}
JSON:
{
"success": true,
"data": {
"match": [
{
"competition_id": 68,
"status": "HALF TIME BREAK",
"ht_score": "0 - 0",
"ft_score": "",
"et_score": "",
"last_changed": "2019-07-28 16:52:14",
"id": 151050,
"league_name": "First Division A",
"away_id": 806,
"score": "0 - 0",
"competition_name": "First Division A",
"events": false,
"home_id": 354,
"away_name": "Gent",
"added": "2019-07-28 15:45:20",
"time": "HT",
"home_name": "Sporting Charleroi",
"league_id": 48
}, //And some more data
]
}
}
【问题讨论】:
-
而不是
catch块print(error)中的print(error.localizedDescription)。 real 错误会准确地告诉您哪里出了问题,甚至在哪里。并且不要将您的结构命名为Data。 Foundation 框架中有一个同名的结构体。 -
打印错误时请执行
if let error = error { print(error)}以获得更详细的错误消息 -
谢谢,这是一个愚蠢的错误。 JSON 数据是 String 而不是 Int。