2017-05-22 4 views
-1

Ich habe versucht, die JSON-Zeichenfolge von Yahoo Finanzen Aktien Daten von der unteren URL zu CSV mit verschiedenen Tools (JSON.NET, etc.) im Internet verfügbar zu analysieren.Nicht möglich, JSON Zeichenfolge CSV von Yahoo Finanzen Aktien Daten zu analysieren

MSFT Yahoo Data

Ich mag JSON-String in der CSV-Format, wie unten zu analysieren.

Datum | Öffnen | Hoch | Niedrig | Schließen | Volume

Bitte helfen Sie mir, dieses Problem zu lösen. Danke im Voraus.

+0

Welches Format der CSV-Datei benötigen Sie? –

+0

@VictorLeontyev siehe bitte die bearbeitete Frage –

Antwort

1

1) Sie müssen Klassen für Yahoo JSON-Schema definieren: (Modified: Einige Werte null sein könnte So habe ich sie als Null-Lage Variablen geändert)

public class Pre 
{ 
    public string timezone { get; set; } 
    public int end { get; set; } 
    public int start { get; set; } 
    public int gmtoffset { get; set; } 
} 

public class Regular 
{ 
    public string timezone { get; set; } 
    public int end { get; set; } 
    public int start { get; set; } 
    public int gmtoffset { get; set; } 
} 

public class Post 
{ 
    public string timezone { get; set; } 
    public int end { get; set; } 
    public int start { get; set; } 
    public int gmtoffset { get; set; } 
} 

public class CurrentTradingPeriod 
{ 
    public Pre pre { get; set; } 
    public Regular regular { get; set; } 
    public Post post { get; set; } 
} 

public class Meta 
{ 
    public string currency { get; set; } 
    public string symbol { get; set; } 
    public string exchangeName { get; set; } 
    public string instrumentType { get; set; } 
    public int firstTradeDate { get; set; } 
    public int gmtoffset { get; set; } 
    public string timezone { get; set; } 
    public string exchangeTimezoneName { get; set; } 
    public CurrentTradingPeriod currentTradingPeriod { get; set; } 
    public string dataGranularity { get; set; } 
    public List<string> validRanges { get; set; } 
} 

public class Quote 
{ 
    public List<object> volume { get; set; } 
    public List<double?> low { get; set; } 
    public List<double?> high { get; set; } 
    public List<double?> close { get; set; } 
    public List<double?> open { get; set; } 
} 

public class Unadjclose 
{ 
    public List<double?> unadjclose { get; set; } 
} 

public class Unadjquote 
{ 
    public List<double?> unadjopen { get; set; } 
    public List<double?> unadjclose { get; set; } 
    public List<double?> unadjhigh { get; set; } 
    public List<double?> unadjlow { get; set; } 
} 

public class Indicators 
{ 
    public List<Quote> quote { get; set; } 
    public List<Unadjclose> unadjclose { get; set; } 
    public List<Unadjquote> unadjquote { get; set; } 
} 

public class Result 
{ 
    public Meta meta { get; set; } 
    public List<int> timestamp { get; set; } 
    public Indicators indicators { get; set; } 
} 

public class Chart 
{ 
    public List<Result> result { get; set; } 
    public object error { get; set; } 
} 

public class RootObject 
{ 
    public Chart chart { get; set; } 
} 

2) Sie müssen. JSON in Objekt deserialisieren

var str = wc.DownloadString("https://query1.finance.yahoo.com/v7/finance/chart/MSFT?range=25y&interval=1d&indicators=quote&includeTimestamps=true&includePrePost=false&corsDomain=finance.yahoo.com"); 
var data = JsonConvert.DeserializeObject<Rootobject>(str); 

3) Dann durchlaufen Sie dieses Objekt und erstellen Sie Ihre CSV. Arbeits Beispiel: (Modified: Einige Werte null sein könnten So habe ich den Code geändert zu überprüfen, ob das NULL-able Variablen bewahrt Wert mit HasValue Eigenschaft vor dem String zu konvertieren.)

var wc = new WebClient(); 
var str = wc.DownloadString("https://query1.finance.yahoo.com/v7/finance/chart/MSFT?range=25y&interval=1d&indicators=quote&includeTimestamps=true&includePrePost=false&corsDomain=finance.yahoo.com"); 
var data = JsonConvert.DeserializeObject<Rootobject>(str); 
var result = new List<string>(); 
var quotesInfo = data.chart.result.First(); 
for (var i = 0; i < quotesInfo.timestamp.Count; i++) 
{ 
    var quotesStr = new List<string>(); 
    var quoteData = quotesInfo.indicators.quote.First(); 
    quotesStr.Add(UnixTimeStampToDateTime(quotesInfo.timestamp[i]).ToString(CultureInfo.InvariantCulture)); 
    quotesStr.Add(quoteData.open[i].HasValue ? quoteData.open[i].ToString() : string.Empty); 
    quotesStr.Add(quoteData.high[i].HasValue ? quoteData.high[i].ToString() : string.Empty); 
    quotesStr.Add(quoteData.low[i].HasValue ? quoteData.low[i].ToString() : string.Empty); 
    quotesStr.Add(quoteData.close[i].HasValue ? quoteData.close[i].ToString() : string.Empty); 
    quotesStr.Add(quoteData.volume[i] != null ? quoteData.volume[i].ToString() : string.Empty); 
    result.Add(string.Join(",", quotesStr)); 
} 
File.WriteAllLines("result.csv",result); 

Modifiziert: Und , Ich habe den Code hinzugefügt, um das timestamp zu DateTime Format zu konvertieren.

public static DateTime UnixTimeStampToDateTime(double unixTimeStamp) 
{ 
    var dtDateTime = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc); 
    dtDateTime = dtDateTime.AddSeconds(unixTimeStamp).ToUniversalTime(); 
    return dtDateTime; 
} 

Am Ende Sie Komma erhalten delimeted CSV

+0

Danke für Ihre wertvolle Antwort. Ist es möglich, dasselbe in VisualBasic 6.0 zu tun? –

+0

Versuchen Sie, dies zu verwenden: http://converter.telerik.com/ –

+0

über Link wird es in VB.Net konvertieren. Mein Bedarf ist in VB6 –

Verwandte Themen