Получать данные в формате JSON, но ничего не печатается (Swift)? - PullRequest
0 голосов
/ 21 марта 2019

Итак, я пытаюсь получить данные из этого API, в настоящее время есть функция для проверки, получаю ли я какие-либо данные и ничего не печатает. Я не получаю сообщение об ошибке, хотя, должно быть, я получаю некоторые данные правильно? Я использую те же функции для анализа JSON в другом файле для другого API, и это работает, так что понятия не имею, что я делаю неправильно.

Это структура для API:

struct Currency: Codable {
    let name: String
    let rate: Double
    let symbol: String

}

Это синтаксический анализ JSON из API, сохранение его в массиве и его печать (чтобы проверить, работает ли он).

// Arrays to store our currency JSON data
    var currencies = [String]()

@objc func fetchJSON() {
        // API for Currency data
        let urlString = "https://api.coinstats.app/public/v1/fiats"

        if let url = URL(string: urlString) {           // If URL is valid
            if let data = try? Data(contentsOf: url) {  // Create a Data object and return the contents of the URL
                // We're OK to parse!
                parse(json: data)
                return
            }
        }
        // Show Error if failed
        performSelector(onMainThread: #selector(showError), with: nil, waitUntilDone: false)
    }

    func parse(json: Data) {
        // Creates an instance of JSONDecoder, which is dedicated to converting between JSON and Codable objects.
        let decoder = JSONDecoder()

        // Call the decode() method on that decoder, asking it to convert our json data into a Cryptocurrencies object.
        if let jsonFiat = try? decoder.decode(Currency.self, from: json) {
            currencies = [jsonFiat.name]
            test()
        } else {
            performSelector(onMainThread: #selector(showError), with: nil, waitUntilDone: false)
        }
    }

    func test(){
     print(currencies)
    }

1 Ответ

1 голос
/ 21 марта 2019

Вам нужно декодировать в массив, а затем отобразить этот массив

if let jsonFiat = try? decoder.decode([Currency].self, from: json) {
    currencies = jsonFiat.map { $0.name }
    test()
}

Ниже приведен мой тестовый код с моей игровой площадки

struct Currency: Codable {
    let name: String
    let rate: Double
    let symbol: String
}

var currencies = [String]()

func fetchJSON() {
    let urlString = "https://api.coinstats.app/public/v1/fiats"        
    if let url = URL(string: urlString), let data = try? Data(contentsOf: url) {  // Create a Data object and return the contents of the URL
        // We're OK to parse!
        parse(json: data)
        return        
    } else {
        print("Download failed")
    }
}

func parse(json: Data) {
    print(json)
    // Creates an instance of JSONDecoder, which is dedicated to converting between JSON and Codable objects.
    let decoder = JSONDecoder()

    // Call the decode() method on that decoder, asking it to convert our json data into a Cryptocurrencies object.
    if let jsonFiat = try? decoder.decode([Currency].self, from: json) {
         currencies = jsonFiat.map { $0.name }
        test()
    } else {
        print("decode failed")
    }
}

func test(){
    print(currencies)
}

fetchJSON()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...