RAW: ETH: USD: TYPE: "5" MARKET: "CCCAGG" FROMSYMBol: "ETH" TOSYMBol: "USD" PRICE: 680.89 CHANGEPCT24HOUR : -9.313816893529749
这是我的结构:
struct Ethereum: Codable { let percentChange24h: String let priceUSD: String private enum CodingKeys: String,CodingKey { case priceUSD = "PRICE",percentChange24h = "CHANGEPCT24HOUR" }}
并实施:
func fetchEthereumInfo(completion: @escaPing (Ethereum?,Error?) -> VoID) { let url = URL(string: "https://min-API.cryptocompare.com/data/pricemultifull?fsyms=ETH&tsyms=USD")! let task = URLSession.shared.dataTask(with: url) { (data,response,error) in guard let data = data else { return } do { if let ethereumUSD = try JsONDecoder().decode([Ethereum].self,from: data).first { print(ethereumUSD) completion(ethereumUSD,nil) } } catch { print(error) } } task.resume()}
控制台打印typeMismatch(Swift.Array< Any>,Swift.DeCodingError.Context(CodingPath:[],deBUGDescription:“预期解码数组< Any>但是找到了一个字典.”,underlyingError:nil))
我无法确定我的代码中要更新的内容或这种形式的API是什么
首先,JsON不包含任何数组.阅读JsON非常容易.只有2个(两个!)集合类型,array []和字典{}.如您所见,JsON字符串中根本没有方括号.任何(子)字典{}必须被解码为它自己的类型,所以它应该是
struct Root : Decodable { private enum CodingKeys : String,CodingKey { case raw = "RAW" } let raw : RAW}struct RAW : Decodable { private enum CodingKeys : String,CodingKey { case eth = "ETH" } let eth : ETH}struct ETH : Decodable { private enum CodingKeys : String,CodingKey { case usd = "USD" } let usd : USD}struct USD : Decodable { private enum CodingKeys : String,CodingKey { case type = "TYPE" case market = "MARKET" case price = "PRICE" case percentChange24h = "CHANGEPCT24HOUR" } let type : String let market : String let price : Double let percentChange24h : Double}
要解码JsON并打印percentChange24h,您必须编写
let result = try JsONDecoder().decode(Root.self,from: data) print("percentChange24h",result.raw.eth.usd.percentChange24h)总结
以上是内存溢出为你收集整理的swift – 希望解码Array但是找到了一本字典全部内容,希望文章能够帮你解决swift – 希望解码Array但是找到了一本字典所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)