我正在尝试将从网站alpha vantage接收的时间序列数据转换为Swift对象,但下面显示的错误消息阻止了它的发生。我的网络功能也能正常工作。如何解决此问题?
https://www.alphavantage.co/query?function=TIME_SERIES_MONTHLY_ADJUSTED&symbol=IBM&apikey=演示
keyNotFound(CodingKeys(stringValue: "meta", intValue: nil), Swift.DecodingError.Context(codingPath: [], debugDescription: "No value associated with key CodingKeys(stringValue: "meta", intValue: nil) ("meta").", underlyingError: nil))
struct TimeSeriesMonthlyAdjusted :Decodable{
let meta: Meta
let timeSeries: [String:OHLC]
}
struct Meta :Decodable{
let symbol:String
enum CodingKey:String{
case symbol = "2. Symbol"
}
}
struct OHLC : Decodable{
let open :String
let close : String
let adjustedClose: String
enum CodingKey:String{
case open = "1. open"
case close = "4. close"
case adjustedClose = "5. adjusted close"
}
}
所以有两件事(对我有效(。添加CodingKey
支持TimeSeriesMonthlyAdjusted
struct TimeSeriesMonthlyAdjusted :Decodable{
enum CodingKeys:String, CodingKey {
case meta = "Meta Data"
case timeSeries = "Monthly Adjusted Time Series"
}
let meta: Meta
let timeSeries: [String:OHLC]
}
以及将所有struct
的的enum CodingKey: String {...}
更改为enum CodingKeys: String, CodingKey {...}
操场测试
确保将Test.json
添加到游乐场中的Resources
文件夹中
struct TimeSeriesMonthlyAdjusted :Decodable{
enum CodingKeys:String, CodingKey {
case meta = "Meta Data"
case timeSeries = "Monthly Adjusted Time Series"
}
let meta: Meta
let timeSeries: [String:OHLC]
}
struct Meta :Decodable{
let symbol:String
enum CodingKeys:String, CodingKey{
case symbol = "2. Symbol"
}
}
struct OHLC : Decodable{
let open :String
let close : String
let adjustedClose: String
enum CodingKeys:String, CodingKey {
case open = "1. open"
case close = "4. close"
case adjustedClose = "5. adjusted close"
}
}
do {
let data = try Data(contentsOf: Bundle.main.url(forResource: "Test", withExtension: "json")!)
try JSONDecoder().decode(TimeSeriesMonthlyAdjusted.self, from: data)
} catch let error {
error
}
您可能还想利用https://app.quicktype.io用于快速将JSON转换为Swift