Ios 如何解码包含日期信息的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",

我的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",
        "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)
    }

  }