2017-06-02 8 views
1

外部APIからJSON応答を取得していますが、デシリアライズしようとして少し問題があります。ここでJSONがある:これは、NULLとしてデシリアライズc#時系列データの解析

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

:ここ

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

は私がにデシリアライズしようとしたクラスです。 TimeSeriesクラスは正しいと思いますが、変更日をどのように扱うかはわかりません。 json2csharpを使用すると、有効なクラスが作成されないため、JSONが無効であることがわかります。

ありがとうございました。

+2

。ここに配列はありません。 JSONの配列は[ – Steve

+0

と同じです。配列ではないことを理解していますが、デシリアライズするためにクラスを構造化する方法がわかりません。 – kwcolson98

+0

私は非常に難しいと思います。たぶん、Json.NETを使った動的解析が行く方法になります。https://weblog.west-wind.com/posts/2012/aug/30/using-jsonnet-for-dynamic-json-parsing – Steve

答えて

0

あなたはJSONで最後の右巻きを逃していると思います。

+0

がクローズを追加しました中括弧 – kwcolson98

0

オブジェクトに非標準の名前を使用していることに注意してください。たとえば、C#変数ではハイフンは使用できません。また、変数は数字で始めることもできません。

生成されるクラスは、次のようになります。

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

これは間違いありませんが、JSONの実際の日付は時間が経つにつれて変化するので、そのインスタンスに対してのみ有効になると思います。 – Steve

+1

JSONを設計する正しい方法は、代わりに配列を使うことです:) – silkfire

1

私は同じ問題に取り組んでおり、解決策を投稿したいと考えています。私はあなたのコードの一部を使って、次のように完成させました。私はそれが動作すると思うが、私はちょうどこれで作業を開始した。

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

}有効なJSON構造ではなく、TimeSeriesDailyクラスも間違って構成されている

関連する問題