пожалуйста, помогите получить данные из json в swift

#json #swift #dictionary #parsing #swiftui

Вопрос:

Я проанализировал данные из файла json, но я не знаю, как получить эти переменные. Нужен код, имя и значение. введите описание изображения здесь Мне нужно отобразить их в таблице с помощью swiftui. У меня беспорядок в консоли, и я не знаю, как получить эти данные введите описание изображения здесь

это структура

 import Foundation

struct CurrencyModel: Codable {
    let valute: [String : Valute]

    enum CodingKeys: String, CodingKey {
        case valute = "Valute"
    }
}

struct Valute: Codable {
    let charCode, name: String
    let value: Double

    enum CodingKeys: String, CodingKey {
        case charCode = "CharCode"
        case name = "Name"
        case value = "Value"
    }
}
 

а это парсер

 class FetchDataVM: ObservableObject {
    var valueData = [String : Any]()

    init() {
        fetchCurrency()
    }

    func fetchCurrency() {
        let urlString = "https://www.cbr-xml-daily.ru/daily_json.js"
        let url = URL(string: urlString)
    
        URLSession.shared.dataTask(with: url!) {data, _, error in
            DispatchQueue.main.async {
                if let data = data {
                    do {
                        let decoder = JSONDecoder()
                        let decodedData = try decoder.decode(CurrencyModel.self, from: data)
                        print(decodedData)
                  
                    } catch {
                        print("Error! Something went wrong.")
                    }
                }
            }
        }.resume()
    }
}
 

Ответ №1:

Поскольку вся необходимая информация содержится в Valute структуре, вам нужны только значения valute словаря. Заменять

 var valueData = [String : Any]()
 

с

 @Published var valueData = [Valute]()
 

и после строки print(decodedData) вставить

 self.valueData = decodedData.valute.values.sorted{$0.name < $1.name}
 

или

 self.valueData = decodedData.valute.values.sorted{$0.charCode < $1.charCode}
 

В представлении вы можете выполнить итерацию массива просто с ForEach помощью выражения

Комментарии:

1. Также используйте оболочку свойств @Published для valueData обновления представления после установки свойства

2. Большое спасибо! Сейчас я проверю. Ты лучший