Anfängerhilfe: Daten aus API in C# Variablen speichern

[CSHARP]
public double low
{
get { return low; }
}
[/CSHARP]
und dann APIlow.Text = Convert.ToString(low);

Ich kann es ja momentan hier nicht testen und kann nur raten, ob die Funktion mit dem Return-Wert weiß, dass der Wert in TickData steht.
Kann ich das nicht direkt mit einem [CSHARP]public double low { get; set; return low; }[/CSHARP] in TickData machen?

Zwischenstandquelltext:
[CSHARP]
/* Programmierer: ***********

*/

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net;
using System.Diagnostics;
using System.IO;
using Newtonsoft.Json;

namespace CEX.io_Windows2
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
string APIdata = “”;
string[] splittedData;
private void refresh_Tick(object sender, EventArgs e)
{
APIdata = new System.Net.WebClient().DownloadString(“https://cex.io/api/ticker/GHS/BTC”); //API download
splittedData = APIdata.Split(’,’); //Splitter, trennen bei Komma (evtl. nicht weiter benötigt?)
var jsonString = APIdata; //Newtonsoft.Json-config
TickData tick = JsonConvert.DeserializeObject(jsonString); //JSON deserialisation
APIlow.Text = Convert.ToString(low);
APIhigh.Text = Convert.ToString(high);
APIlast.Text = Convert.ToString(last);
APIbid.Text = Convert.ToString(bid);
APIask.Text = Convert.ToString(ask);
//Properties-HowTo: http://msdn.microsoft.com/en-us/library/x9fsa0sw.aspx
}

    private void button1_Click(object sender, EventArgs e) //Anzeige der reinen API-Daten
    {
        MessageBox.Show(APIdata, "Here's RAW data *hrhrhr*", MessageBoxButtons.OK, MessageBoxIcon.Information);
    }


    private void Form1_Load(object sender, EventArgs e)
    {
        // Löschen der Beispielwerte für die Übersicht beim Programmstart
        APIask.Text = "";
        APIbid.Text = "";
        APIlast.Text = "";
        APIhigh.Text = "";
        APIlow.Text = "";
        APIvolume.Text = "";
        //Erstes Laden der Werte bei Programmstart (timer erst eine Sekunde später)
        APIdata = new System.Net.WebClient().DownloadString("https://cex.io/api/ticker/GHS/BTC");
        refresh.Enabled = true;
    }
    public class TickData //Newtonsoft.json-config
    {
        public Int64 timestamp { get; set; }
        public double low { get; set; }
        public double high { get; set; }
        public double volume { get; set; }
        public double last { get; set; }
        public double bid { get; set; }
        public double ask { get; set; }
    }
    public double low
    {
        get { return low; }
    }
    public double high
    {
        get { return high; }
    }
    public double volume
    {
        get { return volume; }
    }
    public double last
    {
        get { return last; }
    }
    public double bid
    {
        get { return bid; }
    }
    public double ask
    {
        get { return ask; }
    }

    private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
    {
        System.Diagnostics.Process.Start("http://erbloggt.de");
    }
}

}[/CSHARP]

Nein, woher sollte sie?

Lager TickData in ein eigenes File aus. Und gib deiner Form-Klasse ein Property mit dem Typ TickData, wenn du die Werte nach außen verfügbar machen musst. Ich dachte in der UI reicht es?

Nein, lies dir bitte die MSDN-Seiten durch die ich verlinkt habe. Dein Code ist weder semantisch sinnvoll noch syntaktisch richtig.

instanzVariable.low tut bereits das was es soll!

[QUOTE=schlingel][…]
Ich dachte in der UI reicht es?
[…]
instanzVariable.low tut bereits das was es soll![/QUOTE]
es reicht ja auch für diese eine UI, mehr will ich damit auch nicht machen.

Ich bin dem technischen Englisch ja leider noch nicht so ganz gewachsen, aber irgendwie scheint es mir, als müsste ich da noch irgendein set { } konfigurieren, bevor das get aus der Funktion den richtigen Wert aus dem Deserializer kennt…
ein TimePeriod habe ich ja nicht für die Funktion, die wird ja sowieso beim Timer.Tick immer wieder ausgeführt…

Irgendwie scheine ich das falsch zu Interpretieren:
Muss ich das in eine neue Klasse auslagern?
[CSHARP]class DeserializeToString
{
private double timestamp, low, high, volume, last, bid, ask;
public double low
{
get { return low; }
set { low }
}
//usw…
[/CSHARP]
Mir wird hier immer noch nicht schlüssig, wie ich in der set-funktion irgendwie TickData einbringen kann…

und dann inner Timer-tick-Funktion so vorgehen?
[CSHARP]
private void refresh_Tick(object sender, EventArgs e)
{
APIdata = new System.Net.WebClient().DownloadString(“https://cex.io/api/ticker/GHS/BTC”); //API download

        var jsonString = APIdata; //Newtonsoft.Json-config
        TickData tick = JsonConvert.DeserializeObject<TickData>(jsonString); //JSON deserialisation

        Int64 timestamp;
        double low, high, volume, bid, last, ask;

        APIlow.Text = Convert.ToString(low);
        APIhigh.Text = Convert.ToString(high);
        APIlast.Text = Convert.ToString(last);
        APIbid.Text = Convert.ToString(bid);
        APIask.Text = Convert.ToString(ask);
        //Properties-HowTo: http://msdn.microsoft.com/en-us/library/x9fsa0sw.aspx

        DeserializeToString data = new low();
        data.low = //was muss hier hin?
        
    }

[/CSHARP]
das wirft aber immer noch massig Fehler in die Fehlerliste…

Irgendwie will das Programm beim Timer.Tick plötzlich jetzt nichts mehr laden… Keine Ahnung warum - seit ich den Json-serializer integriert habe ist nichts mehr abgerufen…

Projekt:
[CSHARP]
/* Programmierer: **********

*/

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net;
using System.Diagnostics;
using System.IO;
using Newtonsoft.Json;

namespace CEX.io_Windows2
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
string APIdata = “”;
private void refresh_Tick(object sender, EventArgs e)
{
APIdata = new System.Net.WebClient().DownloadString(“https://cex.io/api/ticker/GHS/BTC”); //API download

        var jsonString = APIdata; //Newtonsoft.Json-config
        TickData tick = JsonConvert.DeserializeObject<TickData>(jsonString); //JSON deserialisation
        APIlow.Text = Convert.ToString(low);
        APIhigh.Text = Convert.ToString(high);
        APIlast.Text = Convert.ToString(last);
        APIbid.Text = Convert.ToString(bid);
        APIask.Text = Convert.ToString(ask);
        //Properties-HowTo: http://msdn.microsoft.com/en-us/library/x9fsa0sw.aspx

        /*
        DeserializeToString data = new low();
        data.low = //was muss hier hin?
         */
    }

    private void button1_Click(object sender, EventArgs e) //Anzeige der reinen API-Daten
    {
        APIdata = new System.Net.WebClient().DownloadString("https://cex.io/api/ticker/GHS/BTC");
        MessageBox.Show(APIdata, "Here's RAW data *hrhrhr*", MessageBoxButtons.OK, MessageBoxIcon.Information);
    }


    private void Form1_Load(object sender, EventArgs e)
    {
        APIdata = new System.Net.WebClient().DownloadString("https://cex.io/api/ticker/GHS/BTC");
        refresh.Enabled = true;
        // Löschen der Beispielwerte für die Übersicht beim Programmstart
        APIask.Text = "";
        APIbid.Text = "";
        APIlast.Text = "";
        APIhigh.Text = "";
        APIlow.Text = "";
        APIvolume.Text = "";
        //Erstes Laden der Werte bei Programmstart (timer erst eine Sekunde später)

    }
    public class TickData //Newtonsoft.json-config
    {
        public Int64 timestamp { get; set; }
        public double low { get; set; }
        public double high { get; set; }
        public double volume { get; set; }
        public double last { get; set; }
        public double bid { get; set; }
        public double ask { get; set; }
    }
    public double low
    {
        get { return low; }
    }
    public double high
    {
        get { return high; }
    }
    public double volume
    {
        get { return volume; }
    }
    public double last
    {
        get { return last; }
    }
    public double bid
    {
        get { return bid; }
    }
    public double ask
    {
        get { return ask; }
    }

    //Copyright-message
    private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
    {
        System.Diagnostics.Process.Start("http://erbloggt.de");
    }
}
class DeserializeToString
{
    /* private double timestamp, low, high, volume, last, bid, ask;
    public double low
    {
        get { return low; }
        set { low }
    }

//usw… */
}
}
[/CSHARP]

Irgendwie muss mir hier jemand mal wieder auf die Sprünge helfen - alleine aus http://msdn.microsoft.com/en-us/library/x9fsa0sw.aspx werde ich irgendwie auch nicht schlauer - und aus dem Projekt auslagern muss ich das ganze ja auch nicht, da es ja nur für dieses eine Projekt genutzt wird…

Ich habe mir jetzt das Properties How-To schon das dritte mal durchgelesen und kann das immer noch nicht auf mein Projekt übertragen mir ist immer noch rätselhaft, was get; und set; sein muss und was es tut - soweit ich sehe muss die double-funktion einen return-Wert haben, aber eben einen Weg zu finden diesen Return-Wert zu bestimmen finde ich nicht…

Die Klasse die ich dir gepostet habe war fertig. Die musst du nicht “adaptieren”.

Das:


public class MyClass
{
  public double MyProp { get; set; }
}

ist eine Abkürzung für


public class MyClass
{
  private double _MyProp;
  public double MyProp
  {
    get { return _MyProp; }
    set { _MyProp = value; }
  }
}

Das ist alles andere als Raketenwissenschaft…

Arbeite vielleicht einmal ein Tutorial durch oder die ersten zwei Kapitel eines C#-Buchs. Das ist echt absolutes Anfängerwissen was man nicht über ein Forum (effektiv) lernen kann sondern nur im Selbststudium.

Edit:/ Jetzt wird mir erst klar was du versuchst zu machen… Du musst eine Klassenvariable anlegen in die du dein TickData reinspeicherst. Dann kannst du auf die Properties zugreifen. Noch einmal die dringende Empfehlung: Nimm dir 5h Zeit, arbeite ein Tutorial durch. Dir fehlen die absoluten Basics.

https://support.cex.io/requests/3862Kurze Zwischenfrage: zu Hause programmiere ich ja mit der DreamSpark-Version von Visual Studio 2013 Ultimate - in der Schule programmieren wir mit Visual Studio 2012 Express - Kann es sein, dass die Funktion zum Schreiben der Daten aus der API in einen String bei mir (VS Ultimate 2013) nicht mehr geht, weil das gleiche Projekt mit den gleichen Daten in der Schule (VS Express 2012) geöffnet war?

Was ich noch vor habe, damit dieses Thema gelöst werden kann:

  • Der JSON-Deserializer gibt ja durch den Timer jede Sekunde Werte aus, die eben hoffentlich double-Werte mit dem Namen und dem Inhalt der jeweiligen Daten sind. Diese Daten müssen im Programm (UI) ja irgendwie angezeigt werden, bzw. irgendwie vorbereitet werden, damit mit eben diesen Double-Werten Berechnungen gemacht werden können. In meinem Fall ist es die Aufgabe simpel gesagt: “Schreibe jede Sekunde den Wert low aus API-Abfrage als string in label1.Text”
    Meine Vermutung dabei war es, dass diese Ausgabe vom JSON Deserializer warum auch immer keine Double-Werte sind und irgendwie konvertiert werden müssen bevor sie das Programm als Double erkennt.

Über die Schule haben wir als Buch “Einstieg in Visual C# 2012” von Galileo Computing (ISBN: 978-3-8362-1960-0) - das führt zu Anfang ziemlich langwierig in Berechnungen und die verschiedenen Arten irgendwas abzuspeichern ein… In den ersten 2 Kapiteln habe ich da noch nichts von der Möglichkeit Daten als “Property” zu speichern gelesen - aber ich werd mal nachschauen was da so zu finden ist

Ich tippe meine Gedanken während des Lernens immer direkt hier ein - ich gebe ja zu, es werden längere Beiträge, aber so hilft es mir wenigstens

TickData ist doch eine Klasse mit mehreren Funktionen (für je ein Wert der API) - und, es ist doch durch public class TickData bereits eine Klasse namens TickData konfiguriert… Also wären die Klassen für den JSON Deserializer schon gegeben.
Zu Properties gibt das Buch folgendes Beispiel (das ich hier mal zitiere:
Form1.cs
[CSHARP]
using System;
using System.Windows.Forms;

namespace Eigenschaftsmethode
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

    private void cmdAnzeigen_Click(object sender, EventArgs e)
    {
        Fahrzeug vespa = new Fahrzeug();
        lblAnzeige.Text = "Geschwindigkeit: " +
            vespa.Geschwindigkeit;
        vespa.beschleunigen(120);
        // vespa.Geschwindigkeit = 50;
        lblAnzeige.Text += "

Geschwindigkeit: " +
vespa.Geschwindigkeit;
}
}
}
[/CSHARP]
Fahrzeug.cs
[CSHARP]
namespace Eigenschaftsmethode
{
class Fahrzeug
{
private int geschwindigkeit;

    public int Geschwindigkeit
    {
        get
        {
            return geschwindigkeit;
        }

        private set
        {
            if (value > 100)
                geschwindigkeit = 100;
            else if (value < 0)
                geschwindigkeit = 0;
            else
                geschwindigkeit = value;
        }
    }

    public void beschleunigen(int wert)
    {
        Geschwindigkeit += wert;
    }
}

}
[/CSHARP]
Beide Dateien haben den gleichen Namespace, bedeutet, die Klassen aus den beiden Dateien könnten auch in einer Datei (in meinem Fall die Form1.cs) ausgeführt werden. Genau dies ist ja mit meinem public partial class Form1 : Form - und public class TickData gegeben.

Das Beispiel ruft die Daten mit
[CSHARP] Fahrzeug vespa = new Fahrzeug();
lblAnzeige.Text = "Geschwindigkeit: " +
vespa.Geschwindigkeit;[/CSHARP]
ab - frei übersetzt nehme ich jetzt einfach mal TickData APIdatenDeserialized = new TickData(); für mein Programm…
Da ich die Werte ja im Label ausgeben will, müssen aus den Daten Strings werden.
Also APIlow.Text = Convert.ToString(APIdaten.low); usw.

Endlich spuckt VS 2013 keinen Fehler mehr aus…
Damit nehme ich mal an, dass ich die Daten aus dem Deserializer erfolgreich umgesetzt sind.
und dank einer Neuerung in VS 2013 sehe ich direkt die Anzahl der Verweise über den jeweiligen Befehlen in der TickData-Klasse - diese zeigen nun endlich einen Verweis an.

Einziges über bleibendes Problem:
refresh_Tick führt (bei einer Zeitspanne von 1050 ms), den Befehl zum Abrufen der API nicht mehr regelmäßig aus.
Problemanalyse:
private void Form1_Load ruft zu erst alle Daten aus der API ab (weil der Timer es ja erst eine Sekunde später machen würde), danach aktiviert sie den Timer und löscht die Werte in den Labels, die ich im Designer immer mit Fülltexten (zur Übersicht) beschreibe.
[CSHARP]
private void Form1_Load(object sender, EventArgs e)
{
APIdata = new System.Net.WebClient().DownloadString(“https://cex.io/api/ticker/GHS/BTC”);
refresh.Enabled = true;

        // Löschen der Beispielwerte für die Übersicht beim Programmstart
        APIask.Text = "";
        APIbid.Text = "";
        APIlast.Text = "";
        APIhigh.Text = "";
        APIlow.Text = "";
        APIvolume.Text = "";
        //Erstes Laden der Werte bei Programmstart (timer erst eine Sekunde später)

    }[/CSHARP]

aus irgendeinerm Grund wird der erste und der zweite Befehl in Form1_Load ignoriert, obwohl das Programm beim Ausführen ja eben ausgeführt wird und damit diese void ja ausführen müsste… - Strg+Klick auf den Link öffnet die URL ja in einem Browserfenster innerhalb von Visual Studio - dieser bleibt auf “Wird geladen…” stehen und kommt irgendwann zu einem Timeout, obwohl die Daten in meinem Chrome-Browser problemlos abrufbar bleiben…

  1. Schritt:
    Ich nutze den Button zum Anzeigen der reinen API-Daten - Dieser zeigt, auch wenn das Programm einige Sekunden lang lief immer noch nichts an, schreibe ich die Funktion zum Abrufen der API noch einmal vor den Befehl der Messagebox, werden die API-Daten direkt angezeigt. - Das Abrufen der Daten klappt also.

Auch die Labels die bei Form1_Load eigentlich geleert werden müssten werden nicht geleert - Ich nehme mal stark an, dass Form1_Load einfach nicht ausgeführt wird - Im Designer heißt mein Fenster aber weiterhin Form1… - Würde es anders heißen, würde die Fehlerliste ja auch Fehler anzeigen.

Irgendwie erkenne ich da des Rätsels Lösung noch nicht, weil eigentlich alles richtig gesetzt ist - das wäre auch das allerletzte, was ich noch machen müsste um das Problem in diesem Thread zu lösen und ihn als “gelöst” zu markieren…
Einzigste logische Erklärung: der Anbieter der API (also CEX.io) sperrt gewisse User Agents von Webbrowsern im vornherein aus.
Dazu habe ich mal ein Supportticket bei deren System gemacht: https://support.cex.io/requests/3862

Meine Aktuelle Projektdatei:
[CSHARP]
/* Programmierer: ****************

*/

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net;
using System.Diagnostics;
using System.IO;
using Newtonsoft.Json;

namespace CEX.io_Windows2
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
string APIdata = “”;
private void refresh_Tick(object sender, EventArgs e)
{
APIdata = new System.Net.WebClient().DownloadString(“https://cex.io/api/ticker/GHS/BTC”); //API download

        var jsonString = APIdata; //Newtonsoft.Json-config
        TickData tick = JsonConvert.DeserializeObject<TickData>(jsonString); //JSON deserialisation starten

        TickData APIdatenDeserialized = new TickData();
        APIlow.Text = Convert.ToString(APIdatenDeserialized.low);
        APIhigh.Text = Convert.ToString(APIdatenDeserialized.high);
        APIlast.Text = Convert.ToString(APIdatenDeserialized.last);
        APIask.Text = Convert.ToString(APIdatenDeserialized.ask);
        APIbid.Text = Convert.ToString(APIdatenDeserialized.bid);
        APIvolume.Text = Convert.ToString(APIdatenDeserialized.volume);
       /* APIlow.Text = TickData.low;
        APIhigh.Text = Convert.ToString(high);
        APIlast.Text = Convert.ToString(last);
        APIbid.Text = Convert.ToString(bid);
        APIask.Text = Convert.ToString(ask); */
        //Properties-HowTo: http://msdn.microsoft.com/en-us/library/x9fsa0sw.aspx

    }

    private void button1_Click(object sender, EventArgs e) //Anzeige der reinen API-Daten
    {
        //APIdata = new System.Net.WebClient().DownloadString("https://cex.io/api/ticker/GHS/BTC");
        MessageBox.Show(APIdata, "Here's RAW data *hrhrhr*", MessageBoxButtons.OK, MessageBoxIcon.Information);
    }


    private void Form1_Load(object sender, EventArgs e)
    {
        APIdata = new System.Net.WebClient().DownloadString("https://cex.io/api/ticker/GHS/BTC");
        refresh.Enabled = true;

        // Löschen der Beispielwerte für die Übersicht beim Programmstart
        APIask.Text = "";
        APIbid.Text = "";
        APIlast.Text = "";
        APIhigh.Text = "";
        APIlow.Text = "";
        APIvolume.Text = "";
        //Erstes Laden der Werte bei Programmstart (timer erst eine Sekunde später)

    }
    public class TickData //Newtonsoft.json-config
    {
        public Int64 timestamp { get; set; }
        public double low { get; set; }
        public double high { get; set; }
        public double volume { get; set; }
        public double last { get; set; }
        public double bid { get; set; }
        public double ask { get; set; }
    }

    //Copyright-message
    private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
    {
        System.Diagnostics.Process.Start("http://erbloggt.de");
    }
}
class DeserializeToString
{

    /* private double timestamp, low, high, volume, last, bid, ask;
    public double low
    {
        get { return low; }
        set { low }
    }

//usw… */
}
}

/*

  • ab hier gibts verwaiste alte Ideen, die ich mal in dem Programm hatte, die sich aber irgendwie nicht
  • bewährt haben, irgendwie aber zu schade zum Verwerfen sind…
    */

/* public static string ConvertStringArrayToString(string[] array)
{
StringBuilder builder = new StringBuilder();
foreach (string value in splittedData)
{
builder.Append(value);
}
return builder.ToString();
}*/

// string html = new System.Net.WebClient().DownloadString(“http://twitter.com”);

/*WebRequest wrGETURL = WebRequest.Create(“https://cex.io/api/ticker/GHS/BTC”);
Stream objStream = wrGETURL.GetResponse().GetResponseStream();

using (StreamReader objReader = new StreamReader(objStream))
{
string sLine = String.Empty;

while ((sLine = objReader.ReadLine()) != null)
{
    Debug.WriteLine(sLine);
    APIdata = sLine;
}

} */
[/CSHARP]

*** Edit ***

So - vorheriges Problem gelöst, nächstes Problem da…

[CSHARP]
public Form1()
{
InitializeComponent();
this.Load += new System.EventHandler(this.Form1_Load);
}
[/CSHARP]
ein Freund machte mich darauf aufmerksam, dass irgendwie mein Form1_Load zerstört sei und obiger Code löst das vorherige Problem.
Nächstes Problem
Die Ausgabe zeigt immer “0” an, anstelle der Strings, die durch den Deserializer ja rauskommen sollten.

Screenshot:

Projekt:
[CSHARP]
/* Programmierer: *************

*/

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net;
using System.Diagnostics;
using System.IO;
using Newtonsoft.Json;

namespace CEX.io_Windows2
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
this.Load += new System.EventHandler(this.Form1_Load);
}
string APIdata = “”;
private void refresh_Tick(object sender, EventArgs e)
{
APIdata = new System.Net.WebClient().DownloadString(“https://cex.io/api/ticker/GHS/BTC”); //API download

        var jsonString = APIdata; //Newtonsoft.Json-config
        TickData tick = JsonConvert.DeserializeObject<TickData>(jsonString); //JSON deserialisation starten

        TickData APIdatenDeserialized = new TickData();
        APIlow.Text = Convert.ToString(APIdatenDeserialized.low);
        APIhigh.Text = Convert.ToString(APIdatenDeserialized.high);
        APIlast.Text = Convert.ToString(APIdatenDeserialized.last);
        APIask.Text = Convert.ToString(APIdatenDeserialized.ask);
        APIbid.Text = Convert.ToString(APIdatenDeserialized.bid);
        APIvolume.Text = Convert.ToString(APIdatenDeserialized.volume);
       /* APIlow.Text = TickData.low;
        APIhigh.Text = Convert.ToString(high);
        APIlast.Text = Convert.ToString(last);
        APIbid.Text = Convert.ToString(bid);
        APIask.Text = Convert.ToString(ask); */
        //Properties-HowTo: http://msdn.microsoft.com/en-us/library/x9fsa0sw.aspx

    }

    private void button1_Click(object sender, EventArgs e) //Anzeige der reinen API-Daten
    {
        //APIdata = new System.Net.WebClient().DownloadString("https://cex.io/api/ticker/GHS/BTC");
        MessageBox.Show(APIdata, "Here's RAW data *hrhrhr*", MessageBoxButtons.OK, MessageBoxIcon.Information);
    }


    private void Form1_Load(object sender, EventArgs e)
    {
        APIdata = new System.Net.WebClient().DownloadString("https://cex.io/api/ticker/GHS/BTC");
        refresh.Enabled = true;

        // Löschen der Beispielwerte für die Übersicht beim Programmstart
        APIask.Text = "";
        APIbid.Text = "";
        APIlast.Text = "";
        APIhigh.Text = "";
        APIlow.Text = "";
        APIvolume.Text = "";
        //Erstes Laden der Werte bei Programmstart (timer erst eine Sekunde später)

    }
    public class TickData //Newtonsoft.json-config
    {
        public Int64 timestamp { get; set; }
        public double low { get; set; }
        public double high { get; set; }
        public double volume { get; set; }
        public double last { get; set; }
        public double bid { get; set; }
        public double ask { get; set; }
    }

    //Copyright-message
    private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
    {
        System.Diagnostics.Process.Start("http://erbloggt.de");
    }
}
class DeserializeToString
{

    /* private double timestamp, low, high, volume, last, bid, ask;
    public double low
    {
        get { return low; }
        set { low }
    }

//usw… */
}
}

/*

  • ab hier gibts verwaiste alte Ideen, die ich mal in dem Programm hatte, die sich aber irgendwie nicht
  • bewährt haben, die aber trotzdem aus welchem Grund auch immer zu Schade dafür sind gelöscht zu werden.
    */

/* public static string ConvertStringArrayToString(string[] array)
{
StringBuilder builder = new StringBuilder();
foreach (string value in splittedData)
{
builder.Append(value);
}
return builder.ToString();
}*/

// string html = new System.Net.WebClient().DownloadString(“http://twitter.com”);

/*WebRequest wrGETURL = WebRequest.Create(“https://cex.io/api/ticker/GHS/BTC”);
Stream objStream = wrGETURL.GetResponse().GetResponseStream();

using (StreamReader objReader = new StreamReader(objStream))
{
string sLine = String.Empty;

while ((sLine = objReader.ReadLine()) != null)
{
    Debug.WriteLine(sLine);
    APIdata = sLine;
}

} */
[/CSHARP]

So - Ein Freund führte mich in die “andere” ungünstigere Herangehensweise ein und zeigte mir dann die Möglichkeit etwas detaillierter - Die Daten sind jetzt nun mit einer Prozedur, die den String trennt, geteilt und angezeigt…
Der Weg über den Deserializer hat noch ein finales Problem (wie oben beschrieben) aber über die String-Trennung komme ich ja auch irgendwie zum Ziel…

Endgültiger Quellcode mit all dem kommentierten Zeug welches ich normalerweise in Programme setze…:
[CSHARP]
/* Programmierer: **********

*/

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net;
using System.Diagnostics;
using System.IO;
//using Newtonsoft.Json; //Serializer

namespace CEX.io_Windows2
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
this.Load += new System.EventHandler(this.Form1_Load); //Fix von Problem 20131214z65
}
private string[] entfriemeln(string rawdata)
{
//Umgehung des JSON-Deserializers (wegen Zeitaufwand dafür)
string[] ergebnis;
int stelle = 0;
List jo = new List();
while (rawdata.IndexOf(’:’, stelle) != -1)
{
stelle = rawdata.IndexOf(’:’, stelle) + 1;
int end = rawdata.IndexOf(’"’, stelle + 1);
jo.Add(rawdata.Substring(stelle + 1, end - stelle - 1));
}
ergebnis = jo.ToArray();
return ergebnis;
}

    string APIdata = "";
    string APIdataNMC = "";
    string APIdataGHSNMC = "";
    private void refresh_Tick(object sender, EventArgs e)
    {
        /* 20131215 - Debugging des Serializers würde zu viel Zeit verschlingen - alternativlösung genommen
         * 
        APIdata = new System.Net.WebClient().DownloadString("https://cex.io/api/ticker/GHS/BTC"); //API download

        var jsonString = APIdata; //Newtonsoft.Json-config
        TickData tick = JsonConvert.DeserializeObject<TickData>(jsonString); //JSON deserialisation starten

        TickData APIdatenDeserialized = new TickData();
        APIlow.Text = Convert.ToString(APIdatenDeserialized.low);
        APIhigh.Text = Convert.ToString(APIdatenDeserialized.high);
        APIlast.Text = Convert.ToString(APIdatenDeserialized.last);
        APIask.Text = Convert.ToString(APIdatenDeserialized.ask);
        APIbid.Text = Convert.ToString(APIdatenDeserialized.bid);
        APIvolume.Text = Convert.ToString(APIdatenDeserialized.volume);
        //20131214 - Problem: Deserializer schreibt nur 0er...

        //Properties-HowTo: http://msdn.microsoft.com/en-us/library/x9fsa0sw.aspx */

        APIdata = new System.Net.WebClient().DownloadString("https://cex.io/api/ticker/GHS/BTC"); //API download
        APIdataNMC = new System.Net.WebClient().DownloadString("https://cex.io/api/ticker/NMC/BTC");
        APIdataGHSNMC = new System.Net.WebClient().DownloadString("https://cex.io/api/ticker/GHS/NMC");

        string[] ergebnis = entfriemeln(APIdata);
        APIlow.Text = ergebnis[1];
        APIhigh.Text = ergebnis[2];
        APIlast.Text = ergebnis[3];
        APIask.Text = ergebnis[6];
        APIbid.Text = ergebnis[5];
        APIvolume.Text = ergebnis[4];

        string[] ergebnisNMC = entfriemeln(APIdataNMC);
        APInmcbtcLow.Text = ergebnisNMC[1];
        APInmcbtcHigh.Text = ergebnisNMC[2];
        APInmcbtcLast.Text = ergebnisNMC[3];
        APInmcbtcAsk.Text = ergebnisNMC[6];
        APInmcbtcBid.Text = ergebnisNMC[5];
        APInmcbtcVolume.Text = ergebnisNMC[4];

        string[] ergebnisGHSNMC = entfriemeln(APIdataGHSNMC);
        APIghsnmcLow.Text = ergebnisGHSNMC[1];
        APIghsnmcHigh.Text = ergebnisGHSNMC[2];
        APIghsnmcLast.Text = ergebnisGHSNMC[3];
        APIghsnmcAsk.Text = ergebnisGHSNMC[6];
        APIghsnmcBid.Text = ergebnisGHSNMC[5];
        APIghsnmcVolume.Text = ergebnisGHSNMC[4];

    }


    private void button1_Click(object sender, EventArgs e) //Anzeige der reinen API-Daten
    {
        //APIdata = new System.Net.WebClient().DownloadString("https://cex.io/api/ticker/GHS/BTC");
        // API bitte bei Buttonclixk nicht erneut abrufen - verfälscht momentan angezeigte Daten.
        MessageBox.Show(APIdata, "Here's RAW data *hrhrhr*", MessageBoxButtons.OK, MessageBoxIcon.Information);
    }
    private void button2_Click(object sender, EventArgs e)
    {
        MessageBox.Show(APIdataNMC, "Here's RAW data *hrhrhr*", MessageBoxButtons.OK, MessageBoxIcon.Information);
    }
    private void button3_Click(object sender, EventArgs e)
    {
        MessageBox.Show(APIdataGHSNMC, "Here's RAW data *hrhrhr*", MessageBoxButtons.OK, MessageBoxIcon.Information);
    }


    private void Form1_Load(object sender, EventArgs e)
    {
        MessageBox.Show("Due to a limit in API calls set by CEX.io this programm refreshes it's data only once every 3 seconds. If you edit the sourcecode and set the API calls to more than 600 calls in 10 Minutes, CEX.io WILL ban your current IP-Adress from the API and from their Homepage! THE PROGRAMMER IS NOT RESPONSIBLE FOR FINANCINAL PROBLEMS IF YOU'RE BANNED FROM CEX.IO!!!", "WARNING", MessageBoxButtons.OK, MessageBoxIcon.Warning);
        APIdata = new System.Net.WebClient().DownloadString("https://cex.io/api/ticker/GHS/BTC");
        //20131214 - Problem: API-Abruf dauerhaft leer - vermutlich server nicht erreichbar - Form1_Load wird nicht weiter ausgef+hrt
        //20131214 - FIXED
        refresh.Enabled = true;

        // Löschen der Beispielwerte für die Übersicht beim Programmstart
        APIask.Text = "";
        APIbid.Text = "";
        APIlast.Text = "";
        APIhigh.Text = "";
        APIlow.Text = "";
        APIvolume.Text = "";
        APInmcbtcAsk.Text = "";
        APInmcbtcBid.Text = "";
        APInmcbtcLast.Text = "";
        APInmcbtcHigh.Text = "";
        APInmcbtcLow.Text = "";
        APInmcbtcVolume.Text = "";
        APIghsnmcAsk.Text = "";
        APIghsnmcBid.Text = "";
        APIghsnmcHigh.Text = "";
        APIghsnmcLast.Text = "";
        APIghsnmcLow.Text = "";
        APIghsnmcVolume.Text = "";
        //Erstes Laden der Werte bei Programmstart (timer erst eine Sekunde später)

    }
    /* public class TickData //Newtonsoft.json-config
     {
         public Int64 timestamp { get; set; }
         public double low { get; set; }
         public double high { get; set; }
         public double volume { get; set; }
         public double last { get; set; }
         public double bid { get; set; }
         public double ask { get; set; }
         //20131130 Problem - Deserialisierungsprozess scheint nicht zu funktionieren - 20131207 FIXED
     } */

    //Copyright-message und Gedöns
    private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
    {
        System.Diagnostics.Process.Start("http://erbloggt.de");
    }

    private void linkLabel2_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
    {
        System.Diagnostics.Process.Start("https://en.wikipedia.org/wiki/Cryptocurrency");
    }

    private void linkLabel3_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
    {
        System.Diagnostics.Process.Start("https://cex.io/r/1/cheaty/0/");
    }
}

class DeserializeToString //nicht benötigt, aber irgendwie spuckt VS2013 immer noch einen Fehler aus wenn ichs wegkommentier
{

    /* private double timestamp, low, high, volume, last, bid, ask;
    public double low
    {
        get { return low; }
        set { low }
    }

//usw… */
}
}

// -------------------------------------------------------------------------------------------------
// Lösungsansatz ohne Deserializer - Falls JSON sich als ineffektiv bzw. zu Ressourcenlastig herausstellt
/* private string[] entfriemeln(string rawdata)
{
string[] ergebnis;
int stelle = 0;
List jo = new List();
while (rawdata.IndexOf(’:’, stelle) != -1)
{
stelle = rawdata.IndexOf(’:’, stelle) + 1;
int end = rawdata.IndexOf(’"’, stelle + 1);
jo.Add(rawdata.Substring(stelle + 1, end - stelle - 1));
}
ergebnis = jo.ToArray();
return ergebnis;
}

/*
*

  •     private void refresh_Tick(object sender, EventArgs e)
    

    {
    APIdata = new System.Net.WebClient().DownloadString(“https://cex.io/api/ticker/GHS/BTC”); //API download

      string[] ergebnis = entfriemeln(APIdata);
    
      APIlow.Text = ergebnis[1];
      APIhigh.Text = ergebnis[2];
      APIlast.Text = ergebnis[3];
      APIask.Text = ergebnis[6];
      APIbid.Text = ergebnis[5];
      APIvolume.Text = ergebnis[4];
    

    }
    */

//-------------------------------------------------------------------------------------------------------------

/*

  • ab hier gibts verwaiste alte Ideen, die ich mal in dem Programm hatte, die sich aber irgendwie nicht
  • bewährt haben, die aber trotzdem aus welchem Grund auch immer zu Schade dafür sind gelöscht zu werden.
    */

/* public static string ConvertStringArrayToString(string[] array)
{
StringBuilder builder = new StringBuilder();
foreach (string value in splittedData)
{
builder.Append(value);
}
return builder.ToString();
}*/

// string html = new System.Net.WebClient().DownloadString(“http://twitter.com”);

/*WebRequest wrGETURL = WebRequest.Create(“https://cex.io/api/ticker/GHS/BTC”);
Stream objStream = wrGETURL.GetResponse().GetResponseStream();

using (StreamReader objReader = new StreamReader(objStream))
{
string sLine = String.Empty;

while ((sLine = objReader.ReadLine()) != null)
{
    Debug.WriteLine(sLine);
    APIdata = sLine;
}

} */
[/CSHARP]