0
votes

Comment décoder JSON contenant une information de date?

J'ai la structure JSON comme:

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
    }


3 commentaires

dans votre décodeur implémenter do / attrape pour vous aider à comprendre l'erreur


intraday doit être une matrice au lieu d'un objet!


Est-ce que cela répond à votre question? Comment analyser un Bloc de données JSON au lieu de toute la séquence JSON


5 Réponses :


1
votes

Remplacez xxx

avec xxx

et complètement débarrasser de structure publique intraday: décodable { < / p>


0 commentaires

-1
votes

Demandez à JSON Creator d'envoyer les données au format ci-dessous, vous devez avoir une clé constante pour analyser. 2019-12-20 15:59:00 Le temps ne doit pas être utilisé comme clé xxx


6 commentaires

Demander au propriétaire de l'API de changer le format est le plus souvent une voie à suivre et spécialement pour quelque chose comme celui-ci qui ressemble à une API d'une tierce partie.


C'est toi qui a posté une réponse, pas moi


Ne vous dérange pas, je demande juste la réponse de la question actuelle :) Je cherche également la réponse, comment analyser ce scénario.


Si vous recherchez également une réponse à la question ci-dessus, pourquoi poster une réponse comme celle-ci?


J'ai essayé de demander à l'entreprise de modifier le format comme vous l'aviez recommandé, dans lequel ils m'ont dit "Vous pouvez le faire en ajoutant et formaté = false à votre demande."


Oui Shabbir, il a changé le format en {"Symbole": "Snap", "Stock_exchange_short": "NYSE", "TimeZone_Nam E": "America / New_York", "intraday": [{"Date": " 2020-01-08 15:59:00 "," Données ": {" Open ":" 16.66 "," Fermer ":" 16,67 "," High ":" 16. 68 "," LOW ":" 16.66 "," V Olume ":" 221296 "}} alors maintenant je devrais pouvoir le faire correctement



1
votes

Je pense que cela devrait être considéré comme une chaîne, alors si vous souhaitez le convertir en une date, vous devrez modifier le t code> pour l'espace pour créer un DateFormatter Code>:

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


0 commentaires

-1
votes

J'ai ajouté et formaté = FALSE à la demande d'URL et obtenu un format différent, qui a fonctionné normalement et était facile à manipuler.


0 commentaires

0
votes

C'est trop tard pour répondre, mais il suffit d'ajouter le code complet si quelqu'un en a encore besoin.

  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 commentaires