Как декодировать JSON, который содержит информацию о дате? - PullRequest
0 голосов
/ 08 января 2020

У меня есть 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
    }

Но это не работает как это должно. Есть идеи, как это можно сделать?

Ответы [ 5 ]

1 голос
/ 08 января 2020

Я думаю, это следует рассматривать как строку, а затем, если вы хотите преобразовать ее в дату, вам нужно будет изменить 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
    }
}
1 голос
/ 08 января 2020

Заменить

let intraday : Intraday?

на

let intraday : [String:WorldTradingIntradayDetails]

И полностью избавиться от public struct Intraday: Decodable {

0 голосов
/ 18 января 2020

слишком поздно, чтобы ответить, но просто добавили полный код, если кому-то он все еще нужен.

  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)
    }

  }
0 голосов
/ 09 января 2020

Я добавил & formatted = false к запросу URL и получил другой формат, который работал нормально и был прост в обращении.

0 голосов
/ 08 января 2020

попросите 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"
            }
    ]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...