Ios 如何解码包含日期信息的JSON?
我的JSON结构如下:Ios 如何解码包含日期信息的JSON?,ios,json,swift,xcode,structure,Ios,Json,Swift,Xcode,Structure,我的JSON结构如下: "symbol": "SNAP", "stock_exchange_short": "NYSE", "timezone_name": "America/New_York", "intraday": { "2019-12-20 15:59:00": { "open": "15.55", "close": "15.55", "high": "15.55", "low": "15.52",
"symbol": "SNAP",
"stock_exchange_short": "NYSE",
"timezone_name": "America/New_York",
"intraday": {
"2019-12-20 15:59:00": {
"open": "15.55",
"close": "15.55",
"high": "15.55",
"low": "15.52",
"volume": "670218"
},
"2019-12-20 15:58:00": {
"open": "15.55",
"close": "15.55",
"high": "15.55",
"low": "15.54",
"volume": "284225"
},
...
}
如何实现日期信息
我试着这样解析它:
public struct WorldTradingIntradayData: Decodable {
let symbol : String
let stock_exchange_short : String
let timezone_name : String
let intraday : Intraday?
}
public struct Intraday: Decodable {
let dateTime: WorldTradingIntradayDetails
public struct WorldTradingIntradayDetails: Decodable {
let open : String
let close : String
let high : String
let low : String
let volume : String
}
但它并没有按预期的那样工作。
你知道怎么做吗?替换
let intraday : Intraday?
与
并且完全摆脱
public struct Intraday:Decodable{
要求json创建者以以下格式发送数据,您需要有一个常量键来解析。
2019-12-20 15:59:00
时间不应用作键
"intraday": [
"dateTime": "2019-12-20 15:59:00",
"data": {
"open": "15.55",
"close": "15.55",
"high": "15.55",
"low": "15.52",
"volume": "670218"
},
"dateTime": "2019-12-20 15:59:00",
"data": {
"open": "15.55",
"close": "15.55",
"high": "15.55",
"low": "15.52",
"volume": "670218"
}
]
我认为应该将其视为字符串,然后如果要将其转换为日期,则需要更改
T
,以便创建dateFormatter
:
struct WorldTradingIntradayData: Decodable {
let symbol: String
let stockExchangeShort: String
let timezoneName: String
let intraday: [String: Intraday]
enum CodingKeys: String, CodingKey {
case symbol
case stockExchangeShort = "stock_exchange_short"
case timezoneName = "timezone_name"
case intraday
}
}
struct Intraday: Decodable {
let intradayOpen: String
let close: String
let high: String
let low: String
let volume: String
enum CodingKeys: String, CodingKey {
case intradayOpen = "open"
case close
case high
case low
case volume
}
}
我在URL请求中添加了&formatted=false,得到了另一种格式,这种格式工作正常且易于处理。回答这个问题太晚了,但如果有人仍然需要它,只需添加完整的代码即可
struct WorldTradingIntradayData: Codable {
let symbol: String
let stock_exchange_short: String
let timezone_name: String
let intraday: [String: DataModel]
}
struct DataModel: Codable {
let open: String
let close: String
let high: String
let low: String
let volume: String
}
let resultsJson = """
{
"symbol": "SNAP",
"stock_exchange_short": "NYSE",
"timezone_name": "America/New_York",
"intraday": {
"2019-12-20 15:59:00": {
"open": "15.55",
"close": "15.55",
"high": "15.55",
"low": "15.52",
"volume": "670218"
},
"2019-12-20 15:58:00": {
"open": "15.55",
"close": "15.55",
"high": "15.55",
"low": "15.54",
"volume": "284225"
}
}
}
""".data(using: .utf8)!
do {
let reponseData = try JSONDecoder().decode(WorldTradingIntradayData.self, from: resultsJson)
//get all dates
let dateArray = reponseData.intraday.keys.map{$0}
print(dateArray)
// use the data from `intraday` array like this to get the data
for date in dateArray {
let data = reponseData.intraday[date]
print(data?.open)
}
}
在解码部分,实现
do/catch
以帮助您计算错误日内
应该是数组而不是对象!这是否回答了您的问题?请求API所有者更改格式通常不是前进的方向,特别是对于类似于第三方API的事情。是您自己我已经发布了一个答案,我不介意,我只是在问实际问题的答案:)我也在寻找答案,如何解析这个场景。如果你也在寻找上述问题的答案,那么为什么要发布这样的答案?我试图要求公司按照你的建议更改格式,他们在其中告诉我“您可以通过在请求中添加&formatted=false来完成此操作。”
struct WorldTradingIntradayData: Codable {
let symbol: String
let stock_exchange_short: String
let timezone_name: String
let intraday: [String: DataModel]
}
struct DataModel: Codable {
let open: String
let close: String
let high: String
let low: String
let volume: String
}
let resultsJson = """
{
"symbol": "SNAP",
"stock_exchange_short": "NYSE",
"timezone_name": "America/New_York",
"intraday": {
"2019-12-20 15:59:00": {
"open": "15.55",
"close": "15.55",
"high": "15.55",
"low": "15.52",
"volume": "670218"
},
"2019-12-20 15:58:00": {
"open": "15.55",
"close": "15.55",
"high": "15.55",
"low": "15.54",
"volume": "284225"
}
}
}
""".data(using: .utf8)!
do {
let reponseData = try JSONDecoder().decode(WorldTradingIntradayData.self, from: resultsJson)
//get all dates
let dateArray = reponseData.intraday.keys.map{$0}
print(dateArray)
// use the data from `intraday` array like this to get the data
for date in dateArray {
let data = reponseData.intraday[date]
print(data?.open)
}
}