Вопрос по парсингу JSON
Подскажите, в JSON'e данные приходят в виде:
name: Afghanistan
languages: Pashto, Uzbek, Turkmen
При запуске, в поле cell.countryLanguage.text выводится только первый язык Pashto. Как мне связать, чтобы у Afghanistan было три языка — Pashto, Uzbek, Turkmen?
Код я сократил намного, постарался оставить самую суть.
struct CountryElement: Codable {
let name: String
let languages: [Language]
}
struct Language: Codable {
let iso6391: String?
let iso6392: String
let name: String
let nativeName: String?
}
var name = [String]()
var languages = [Language]()
struct CountryStruct {
var name: String
var languages: Language
}
func getData(_ completion: @escaping() -> Void, JSONerrorAlertCallBack: @escaping() -> Void, serverErrorCallBack: @escaping() -> Void) {
let urlString = "https://restcountries.com/v2/all"
let configuration = URLSessionConfiguration.ephemeral
let session = URLSession(configuration: configuration)
guard let url = URL(string: urlString) else {
return
}
let task = session.dataTask(with: url) { (data, response, error) in
guard let data = data else { return }
guard error == nil else { return }
do {
let countryInfo = try JSONDecoder().decode([CountryElement].self, from: data)
for index in 0..<countryInfo.count {
name.append(countryInfo[index].name)
languages.append(contentsOf: countryInfo[index].languages)
}
} catch let error {
print(error)
}
completion()
}
task.resume()
}
final class Countries {
func sortArrays(JSONerrorAlertCallBack: @escaping() -> Void) -> [CountryStruct] {
var sortedCountries = [CountryStruct]()
for index in 0..<name.count {
sortedCountries.append(CountryStruct(name: name[index], languages: languages[index]))
}
return sortedCountries
}
}
cell.countryName.text = allcountries[indexPath.row].name
cell.countryLanguage.text = allcountries[indexPath.row].languages.name
[{"name":"Afghanistan","topLevelDomain":[".af"],"alpha2Code":"AF","alpha3Code":"AFG","callingCodes":["93"],"capital":"Kabul","altSpellings":["AF","Afġānistān"],"region":"Southern Asia","continent":"Asia","population":27657145,"latlng":[33.0,65.0],"demonym":"Afghan","area":652230.0,"gini":29.4,"timezones":["UTC+04:30"],"borders":["IRN","PAK","TKM","UZB","TJK","CHN"],"nativeName":"افغانستان","numericCode":"004","currencies":[{"code":"AFN","name":"Afghan afghani","symbol":"؋"}],"languages":[{"iso639_1":"ps","iso639_2":"pus","name":"Pashto","nativeName":"پښتو"},{"iso639_1":"uz","iso639_2":"uzb","name":"Uzbek","nativeName":"Oʻzbek"},{"iso639_1":"tk","iso639_2":"tuk","name":"Turkmen","nativeName":"Türkmen"}],"translations":{"br":"Afeganistão","pt":"Afeganistão","nl":"Afghanistan","hr":"Afganistan","fa":"افغانستان","de":"Afghanistan","es":"Afganistán","fr":"Afghanistan","ja":"アフガニスタン","it":"Afghanistan","hu":"Afganisztán"},"flags":["https://restcountries.com/data/afg.svg","https://restcountries.com/data/png/afg.png"],"regionalBlocs":[{"acronym":"SAARC","name":"South Asian Association for Regional Cooperation"}],"cioc":"AFG","independent":true}]
Ответы (2 шт):
Так у вас же структура страны содержит только один язык
struct CountryStruct {
var name: String
var languages: Language
}
И заполняете вы ее только с одним языком
CountryStruct(name: name[index], languages: languages[index])
Поменяйте на массив как у CountryElement, либо создавайте их столько, сколько языков в стране.
Сейчас, насколько можно понять из приведенного кода, у вас создается одна структура на страну.
Сделайте вот так внутри getData:
for index in 0..<countryInfo.count {
for language in 0..<countryInfo[index].languages.count {
name.append(countryInfo[index].name)
languages.append(countryInfo[index].languages[language])
}
}
Это вам поможет, но в этом случае у вас будет столько записей стран, сколько языков, что не очень эффективно. На самом деле, вам достаточно всё парсить в один массив CountryElement и брать данные сразу из него, а CountryStruct, name и languages не нужны.