Swift 4 JSON Parsing (ожидается декодирование массива <Any>, но вместо него найден словарь) - PullRequest
0 голосов
/ 26 апреля 2018

Кажется, я не могу понять, как правильно декодировать этот API.Это все словари ({...}), но мой код продолжает пытаться деконструировать его как массив.

Код ошибки:

 Error serialising json typeMismatch(Swift.Array<Any>, Swift.DecodingError.Context(codingPath: [], debugDescription: "Expected to decode Array<Any> but found a dictionary instead.", underlyingError: nil))
2018-04-25 22:41:50.570999+0100 APItest[40741:729417] TIC Read Status [1:0x0]: 1:57
2018-04-25 22:41:50.571127+0100 APItest[40741:729417] TIC Read Status [1:0x0]: 1:57

Ссылка на API для анализа: https://api.coinbase.com/v2/exchange-rates?currency=BTC

Код:

func mainExchanges(){
    let jsonUrlString = "https://api.coinbase.com/v2/exchange-rates?currency=BTC"
    guard let url = URL(string: jsonUrlString) else
    { return }

    URLSession.shared.dataTask(with: url)
        { (data,response,err) in
            guard let data = data else
            {
                print("Error: No data to decode")
                return
            }
            do
            {
                let exchanges = try
                    JSONDecoder().decode([Exchanges].self, from: data)
                print(exchanges[0].data.rates.EUR)
            }
            catch let jsonErr
                {
                    print("Error serialising json",jsonErr)
                }
        }
    .resume()
}

Структура:

 struct Exchanges: Decodable   {
        let data: currency

        struct currency: Decodable {
            let currency: String
            let rates: Rates

            struct Rates: Decodable {
                let GBP: String
                let EUR: String
                let USD: String
            }
        }
    }

Я также попытался структурировать это как

struct Exchanges {} 
     struct currency {}
         struct rates {}

1 Ответ

0 голосов
/ 26 апреля 2018

Ваши данные не массив, это словарь.Чтобы разобрать его, вы можете использовать:

let exchanges = try
                JSONDecoder().decode(Exchanges.self, from: data)

Если вы хотите преобразовать его в массив, то создайте новый объект массива как:

let exchange: [Exchanges] = [exchanges]
...