Я использую JSONDecoder для декодирования из файла JSON, в котором есть вложенные словари. Он не может декодировать данные json в мою настроенную модель.
Это то, что я пробовал в своем коде.
- JSONDecoder выглядит так:
let netWorkManager = NetWorkManager(URL: url, httpMethodType: .GET)
netWorkManager.callAPI { (data, status, error) in
guard let data = data else {
onFail(NetWorkError.otherError)
return
}
switch status {
case 200:
do{
if let responseModel = try JSONDecoder().decode(ResonseModel?.self, from: data) {
onSuccess(responseModel)
}
}catch {
onFail(NetWorkError.otherError)
}
default:
onFail(NetWorkError.otherError)
}
}
- Модель выглядит так:
struct ResonseModel: Codable {
let type : String
let format: String
let data: [String: Champion]
struct Champion: Codable {
let version: String
let id: String
let key: Int
let name: String
let title: String
let blurb: String
}
}
- Структура JSON выглядит так:
{
"type": "champion",
"format": "standAloneComplex",
"version": "9.3.1",
"data": {
"Aatrox": {
"version": "9.3.1",
"id": "Aatrox",
"key": "266",
"name": "Aatrox",
"title": "the Darkin Blade",
"blurb": "Once honored defenders of Shurima against the Void, Aatrox and his brethren would eventually become an even greater threat to Runeterra, and were defeated only by cunning mortal sorcery. But after centuries of imprisonment, Aatrox was the first to find...",
"info": {
"attack": 8,
"defense": 4,
"magic": 3,
"difficulty": 4
},
"tags": [
"Fighter",
"Tank"
],
"partype": "Blood Well",
},
"Ahri": {
"version": "9.3.1",
"id": "Ahri",
"key": "103",
"name": "Ahri",
"title": "the Nine-Tailed Fox",
"blurb": "Innately connected to the latent power of Runeterra, Ahri is a vastaya who can reshape magic into orbs of raw energy. She revels in toying with her prey by manipulating their emotions before devouring their life essence. Despite her predatory nature...",
"info": {
"attack": 3,
"defense": 4,
"magic": 8,
"difficulty": 5
},
"tags": [
"Mage",
"Assassin"
],
"partype": "Mana",
},
...
это ссылка на JSON, если вы хотите изучить его: http://ddragon.leagueoflegends.com/cdn/9.3.1/data/en_US/champion.json
Я хочу декодировать свойство «данные» как словарь, ключ которого - это имя чемпиона, а значение - чемпион. Но похоже, что jsonDecoder не распознает мою структуру модели. В конечном итоге он перехватывает ошибку.
ResonseModel?.self
. Что то, что для? Может быть, расшифровать? Это чушь, цельdo catch
- либо метод возвращает что-то необязательное в случае успеха, либо выдает ошибку. Белый или черный без оттенков серого. Внутри блокаdo
пишите всегдаlet responseModel = try JSONDecoder().decode(ResonseModel.self, from: data)
безif
. И вы, вероятно, имеете в виду Res p onseModel ???? - person vadian   schedule 26.03.2019catch
всегда настоящая ошибка при декодировании JSON, а не при передаче бессмысленной фантастической ошибки.DecodingError
очень информативны и сообщают вам, что не так и где. - person vadian   schedule 26.03.2019