Проблема, как уже сообщал @AhmadF, заключается в том, что декодер ожидает декодирования Double, но вместо этого нашел строку.Лучшим решением было бы вместо того, чтобы изменять тип свойств, это реализовать свой собственный декодер, чтобы декодировать эти строки и привести их к Double.
Примечание: Вы должны объявить свои свойства структуры как константы и только необязательные, которыесервер не может быть возвращен (api):
struct TOTicker: Codable {
let success: Bool
let initialprice: Double
let price: Double
let high: Double
let low: Double
let volume: Double
let bid: Double
let ask: Double
}
Пользовательский декодер:
extension TOTicker {
public init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
guard
let initialprice = try Double(container.decode(String.self, forKey: .initialprice)),
let price = try Double(container.decode(String.self, forKey: .price)),
let high = try Double(container.decode(String.self, forKey: .high)),
let low = try Double(container.decode(String.self, forKey: .low)),
let volume = try Double(container.decode(String.self, forKey: .volume)),
let bid = try Double(container.decode(String.self, forKey: .bid)),
let ask = try Double(container.decode(String.self, forKey: .ask))
else {
throw DecodingError.dataCorrupted(DecodingError.Context(codingPath: container.codingPath, debugDescription: "Error decoding String into Double"))
}
success = try container.decode(Bool.self, forKey: .success)
self.initialprice = initialprice
self.price = price
self.high = high
self.low = low
self.volume = volume
self.bid = bid
self.ask = ask
}
}
Теперь вы можете правильно декодировать свой json:
let data = Data("""
{"success":true,"initialprice":"0.00003592","price":"0.00006587",
"high":"0.00006599","low":"0.00003499","volume":"0.68979910",
"bid":"0.00006205","ask":"0.00006595"}
""".utf8)
let decoder = JSONDecoder()
do {
let ticker = try decoder.decode(TOTicker.self, from: data)
print(ticker)
} catch {
print(error)
}
Это напечатает:
TOTicker (успех: истина, начальная цена: 3.5920000000000002e-05, цена: 6.5870000000000005e-05, высокая: 6.59899999999999999e-05, низкая: 3.4990000000000002e-05,объем: 0,6897991, ставка: 6,2050000000000004e-05, спрос: 6,5950000000000004e-05)