我正在从返回数组的API中获取数据,但需要用具有“子级别”的API替换它:
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: "Expected to decode Array<Any> but found a dictionary instead.", underlyingError: nil))
我真的不知道要更新什么代码或这种形式的API是什么
首先,JSON不包含任何数组。读取JSON非常非常容易。只有2种(两种!)集合类型,即array []
和dictionary
{}
。如您所见,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)
我目前正在听这个。我试图把它缩小到一个最小的可重复的例子。 这给我留下了: 以前,我将我的存储在像这样的中 但是现在我想重构一些东西,并引入了一个结构,并将东西存储为
我今天才开始使用翻新图书馆。我在获取一些json数据时遇到问题。 我试图获取的JSON数据如下所示: 求求你,救命!
问题内容: 我已经声明了公共静态数组的名称和ID: 但是说: 我不知道怎么了 是我声明变量的方式还是写的方法? 问题答案: 您在静态String数组和传递给该方法的本地String变量之间发生冲突。 最好的解决方案是使用不同的名称。这将使代码更容易理解。 如果仍然坚持使用相同的名称,则可以通过使用类名称访问静态数组来解决名称冲突: 这同样适用于您的int数组和int变量。
我在MyBatis中使用了Spring,它在单个数据库中运行得非常好。我在尝试添加另一个数据库时遇到了困难(请参见Github上的可复制示例)。 你能看出我哪里出了问题吗?
我得到这个错误: ValueError:检查输入时出错:预期序列有3个维度,但得到了形状为(500400)的数组 以下是我正在使用的代码。 输出(这里每行有500行): 代码: 有什么见解吗?