Ошибка синтаксического анализа словаря JSON с возможностью декодирования Swift - PullRequest
0 голосов
/ 02 мая 2018

Я получаю следующую ошибку:

Ошибка сериализации json typeMismatch (Swift.Dictionary, Swift.DecodingError.Context (codingPath: [], debugDescription: «Предполагается, что декодируется словарь, но вместо него найден массив.», UnderError: nil))

Код:

//---------------
struct Currency: Decodable   {
    let symbol: String
    let price: String
}
var myDict: [Currency] = []
//---------------

func testParse(){
    let jsonUrlString = "https://api.binance.com/api/v3/ticker/price"
    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(Currency.self, from: data)
            let X: [Currency] = [exchanges]
            self.myDict = X
            self.testFunc()
            print("binance: "+self.myDict[0].symbol + ": "+self.myDict[0].price)
        }
        catch let jsonErr
        {
            print("Error serialising json",jsonErr)
        }
    }
    .resume()
}

Проблема с моей структурой макета? Или это будет как я разбираю? Я хотел бы получить лучшее понимание здесь для дальнейшего использования. Поэтому, если бы кто-нибудь мог связать хорошее руководство по Swift 4, это было бы очень признательно. В качестве альтернативы, если бы вы могли дать мне подробный ответ, который был бы великолепен (вместо того, чтобы кормить меня ложкой, где я не учусь).

1 Ответ

0 голосов
/ 02 мая 2018

Пожалуйста, , внимательно прочитайте сообщение об ошибке и научитесь его понимать. Это очень ясно.

Ожидается декодирование словаря, но вместо него найден массив

Другими словами: вы хотите декодировать словарь (Currency), но на самом деле это массив ([Currency]).
В терминах Decodable a словарь является целевой структурой или классом.

И, пожалуйста, не называйте объект как ...dict, который на самом деле является массивом.

var myArray = [Currency]()

...

let exchanges = try JSONDecoder().decode([Currency].self, from: data)
self.myArray = exchanges
...