2017-06-02 3 views
1

Je reçois une réponse JSON d'une API externe et j'éprouve un léger problème de désérialisation. Voici le JSON:C# analyse des données de séries temporelles

{ 
"Time Series (Daily)": { 
    "2017-06-01": { 
     "1. open": "70.2400", 
     "2. high": "70.6100", 
     "3. low": "69.4510", 
     "4. close": "70.1000", 
     "5. volume": "21066468" 
    }, 
    "2017-05-31": { 
     "1. open": "70.5300", 
     "2. high": "70.7400", 
     "3. low": "69.8100", 
     "4. close": "69.8400", 
     "5. volume": "30436364" 
    } 
} 
} 

Voici les classes que j'ai essayé désérialiser dans:

public class StockQuote 
{ 
    [JsonProperty("Time Series (Daily)")] 
    public TimeSeriesDaily Daily { get; set; } 

} 

public class TimeSeriesDaily 
{ 
    public string Date { get; set; } 
    public TimeSeries[] Daily { get; set; } 
} 

public class TimeSeries 
{ 
    [JsonProperty("1. open")] 
    public string Open { get; set; } 
    [JsonProperty("2. high")] 
    public string High { get; set; } 
    [JsonProperty("3. low")] 
    public string Low { get; set; } 
    [JsonProperty("4. close")] 
    public string Close { get; set; } 
    [JsonProperty("5. volume")] 
    public string Volume { get; set; } 
} 

Cette désérialise comme nulle. Je pense que la classe TimeSeries est correcte, mais je ne sais pas comment gérer la date de changement. L'utilisation de json2csharp ne crée pas de classe valide pour moi, elle me dit que le JSON est invalide.

Merci pour votre aide.

+2

Ce n'est pas une structure JSON valide et la classe TimeSeriesDaily est également mal structuré. Il n'y a pas de tableau ici. Les tableaux dans JSON sont comme [] – Steve

+0

Je comprends que ce n'est pas un tableau, mais je ne suis pas sûr de savoir comment structurer ma classe pour la désérialiser. – kwcolson98

+0

Ce serait très difficile je pense. Peut-être que l'analyse dynamique avec Json.NET serait la voie à suivre .. https://weblog.west-wind.com/posts/2012/aug/30/using-jsonnet-for-dynamic-json-parsing – Steve

Répondre

0

Il vous manque un dernier bouclé droit dans le JSON, je pense.

+0

ajouté la fermeture accolade – kwcolson98

0

Prenez garde que vous utilisez des noms non standard pour vos objets. Les traits d'union ne sont pas autorisés dans les variables C# par exemple. Les variables ne peuvent pas non plus commencer par un nombre.

La classe générée devrait ressembler à ceci.

using Newtonsoft.Json; 
using Newtonsoft.Json.Linq; 

using System; 
using System.Collections.Generic; 

namespace kwcolson98 
{ 
    public class StockQuote 
    { 
     [JsonProperty("Time Series (Daily)")] 
     public TimeSeriesDaily _TimeSeriesDaily { get; set; } 


     public class TimeSeriesDaily 
     { 
      [JsonProperty("2017-06-01")] 
      public TimeSeries _20170601 { get; set; } 

      [JsonProperty("2017-05-31")] 
      public TimeSeries _20170531 { get; set; } 


      public class TimeSeries 
      { 
       [JsonProperty("1. open")] 
       public string Open { get; set; } 

       [JsonProperty("2. high")] 
       public string High { get; set; } 

       [JsonProperty("3. low")] 
       public string Low { get; set; } 

       [JsonProperty("4. close")] 
       public string Close { get; set; } 

       [JsonProperty("5. volume")] 
       public string Volume { get; set; } 
      } 
     } 
    } 
} 
+0

Bien que ce soit correct, je pense que les dates JSON réelles changeraient au fil du temps donc le rendrait seulement valide pour cette instance. – Steve

+1

Ensuite, la façon correcte de concevoir le JSON est de faire usage d'un tableau à la place :) – silkfire

1

Je travaille sur le même problème et je voulais poster ma solution. J'ai utilisé une partie de votre code et l'ai complété comme suit. Je pense que cela fonctionne mais je viens juste de commencer à travailler dessus.

class CustomDateTimeConverter : IsoDateTimeConverter 
{ 
    public CustomDateTimeConverter() 
    { 
     base.DateTimeFormat = "yyyy-mm-dd"; 
    } 
} 


public class StockQuote 
{ 
    [JsonProperty("Time Series (Daily)")] 
    public Dictionary<string, TimeSeries> tsd { get; set; } 
} 


public class TimeSeriesDaily 
{ 
    [JsonProperty(ItemConverterType = typeof(CustomDateTimeConverter))] 
    public TimeSeries ts { get; set; } 

} 

public class TimeSeries 
{ 
    [JsonProperty("1. open")] 
    public string Open { get; set; } 

    [JsonProperty("2. high")] 
    public string High { get; set; } 

    [JsonProperty("3. low")] 
    public string Low { get; set; } 

    [JsonProperty("4. close")] 
    public string Close { get; set; } 

    [JsonProperty("5. volume")] 
    public string Volume { get; set; } 

}