Entwickler-Ecke

Netzwerk - json Datei in C# übers Web integrieren...


tomycat - Di 08.06.21 09:23
Titel: json Datei in C# übers Web integrieren...
hallo,
ich habe eine Json Datei http://blablalal.com/jsonfile
Wenn ich diesen Pfad über Firefox aufrufe kann ich mir die Rohdaten sehen.

Ich will einfach nur den Antwort in einem Cstring haben.

Über google fand ich viel, aber das sind Projekt mit dem ich mich Tage lange beschäftigen muss.
Geht das nicht einfacher?


Ralf Jansen - Di 08.06.21 09:47

Es ist eigentlich simpel außer du versuchst noch Dinge zu lösen die du hier nicht erwähnst (Authentifizierung, tooles ErrorHandling, brauchst spezifische RequestHeader etc.) oder scheiterst an irgendwelchen Sprachfeatures die du nicht erwähnst.


C#-Quelltext
1:
2:
3:
string result;
using (var httpClient = new HttpClient())
    result = await httpClient.GetStringAsync("https://blablalal.com/jsonfile");


tomycat - Di 08.06.21 10:23

vielen vielen Dank.


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
class Loadlist
{
    public String address;
    public async Task LoaderAsync()
    {
        string result;
        using (var httpClient = new HttpClient())
            result = await httpClient.GetStringAsync(address);
    }
}

private void button1_Click(object sender, EventArgs e)
{
    Loadlist mylist = new Loadlist();
    mylist.address = "http://bllbalbal.de/json";
    await mylist.LoaderAsync();                  /////////// Rot
}


ich weis dass es nicht die beste Methode ist, ich will erstmal dass es funktioniert. VS schlägt mir vor, ich solle die Struktur von Button1 verändern.
Geht das auch anders?

Moderiert von user profile iconTh69: Code- durch C#-Tags ersetzt


Th69 - Di 08.06.21 11:00

Sobald du await verwendest, mußt du die Methode mit async deklarieren (also bei dir die button1_Click).

PS: Was ist mit deiner anderen Frage bzgl. JSON?


tomycat - Di 08.06.21 13:43

@TH69
Der Button geht danach nicht mehr.

@all

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
internal class Loadlist
{
    public String address;
    public String result;
    public async Task<string> LoaderAsync()
    {
        // string result;
        using (var httpClient = new HttpClient())
            result = await httpClient.GetStringAsync(address);
        //  Console.Write(result);
        return result;
    }
}

/////////////////////

private void button1_Click(object sender, EventArgs e)
{
    Loadlist mylist = new Loadlist();
    mylist.address = "https://blsblslblsls.de";
    mylist.LoaderAsync();
    System.Threading.Thread.Sleep(5000);
    Console.Write(mylist.result);
}


ich brauche das Result für die Weiterverarbeitung.
Die Ausgabe geht oben, aber nicht als return, trotz 5000 ms warten
Was muss ich ändern?

Moderiert von user profile iconTh69: Code- durch C#-Tags ersetzt


tomycat - Di 08.06.21 15:51

Nachtrag....


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
await mylist.LoaderAsync(); //  <<-------- await hinzugefügt

// von 
private void button1_ClickAsync(object sender, EventArgs e)
// in
private async Task button1_ClickAsync(object sender, EventArgs e)

/////////////////////

// button1
// 
this.button1.Location = new System.Drawing.Point(23125);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(7523);
this.button1.TabIndex = 1;
this.button1.Text = "my test";
this.button1.UseVisualStyleBackColor = true;
this.button1.Click += new System.EventHandler------->>(this.button1_ClickAsync)<------; //wurde rot unterstrichen...

Zitat:
//Schweregrad Code Beschreibung Projekt Datei Zeile Unterdrückungszustand
Fehler CS0407 'Der Rückgabetyp von "Task Form1.button1_ClickAsync(object, EventArgs)" ist falsch.


Moderiert von user profile iconTh69: C#-Tags hinzugefügt


Th69 - Di 08.06.21 16:43

Wieso hast du denn den Rückgabetyp geändert?


tomycat - Di 08.06.21 18:31

thx,
result ist ein Cstring und den gebe ich zurück ?!

C#-Quelltext
1:
Console.Write(mylist.result); <---- Die Funktion will ein CString ?!                    

Sorry, verstehe deine Frage nicht.

Moderiert von user profile iconTh69: C#-Tags hinzugefügt


Th69 - Di 08.06.21 19:26

Ich meine von deiner Ereignismethode, also

C#-Quelltext
1:
2:
3:
4:
private async void button1_ClickAsync(object sender, EventArgs e)
{
  await ...
}

Was ja auch die Fehlermeldung besagt...

PS: Was meinst du eigentlich mit "CString"? Die .NET-Klasse heißt String (bzw. als Schlüsselwort string).


tomycat - Di 08.06.21 20:12

ähhh Cstring ??!?! Wie komme ich auf CString? :-)
Ich meine String.


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
// wenn ich aus...
mylist.LoaderAsync();
// ein
await mylist.LoaderAsync();
// erstelle, dann ist die Zeile rot und VS macht mir eine Vorschlag mit...
// von 
private void button1_ClickAsync(object sender, EventArgs e)
// in
private async Task button1_ClickAsync(object sender, EventArgs e)


Soll ich den Vorschlag annehmen?
Sorry, ich stehe voll auf dem Schlauch.


Moderiert von user profile iconTh69: Falsche "csharp"- durch C#-Tags ersetzt


Ralf Jansen - Di 08.06.21 20:24

Mach es so wie user profile iconTh69 zeigt.

Visual Studio macht an der Stelle Mist. Eigentlich darf eine async Methode nicht void sein da kommt immer ein Task zurück darum macht der Visual Studio Wizard das auch so.
Immer meint aber nur fast immer. Bei Delegaten/EventHandlern darf der Rückgabe Typ dann doch void sein. Genauer muss void sein.

Vermutlich müssen wir noch ein paar Patches für Visual Studio warten bis die Refactorings/Wizards erkennen wenn eine Methode eine Delegat ist und nicht nur irgendeine Methode.


tomycat - Di 08.06.21 21:04

ok,ich habe den Faden verloren.
Wie muss der Button/Class jetzt aussehen?
Die Class soll ins Internet connecten und mir die Json Info holen und mir mit return oder über LoadList.result die Resultate übergeben.

Muss/Soll ich jetzt await vor mylist.LoaderAsync(); setzen ODER nicht? Wenn ja, was tun wenn es Rot unterstrichen wird?

Moderiert von user profile iconTh69: C#-Tags hinzugefügt


Th69 - Di 08.06.21 21:53

Ist das so schwierig? Hast du noch nie mit asynchronen Methoden gearbeitet?


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
private async void button1_Click(object sender, EventArgs e)
{
    Loadlist mylist = new Loadlist();
    mylist.address = "https://blsblslblsls.de";
    string result = await mylist.LoaderAsync(); // du solltest die Adresse als Parameter übergeben
    Console.Write(result); // du brauchst keine Membervariable mylist.result
}


PS: Die C#-Tags hier sind "[cs]", nicht "[csharp]".

PPS: Deine andere JSON-Frage ist immer noch unbeantwortet von dir.


tomycat - Mi 09.06.21 08:26

Ich habe mal mit asynchronen Methoden gearbeitet, ich aber schon lange her.

Es ist eine Allgemeine Json Web Abfrage. Aber es ist Json.

Ich habe jetzt den Button von Th69 genommen.
Das komische ist daran, ich klicke auf den Button von Th69 und der Json string von der Webseite wird nicht ausgegeben. Wenn ich einen anderen Button anklicke, der nichts mit der Sache tun hat, dann kommt der Json string. Der andere Button läd nur eine jon Datei von der Festplatte und gibts sie dann auf die Konsole aus.

Die Klasse Load soll nur für das holen der Json Info von der Webseite sein.
Mit Return soll der Json String zurückkehren.

Der Json String durchläuft dann später mehrere Klassen.


Th69 - Mi 09.06.21 10:10

Geht es dir um die Konsolenausgabe? Hast du mal einen Haltepunkt dort gesetzt?
Evtl. wird erst bei einem NEWLINE die Zeile ausgegeben, d.h. verwende mal WriteLine bzw. explizit Console.Out.Flush().

PS: Wieso hast du überhaupt eine Konsolenausgabe in einem WinForms-Projekt?

PPS: Du hast immer noch nichts zu deinem anderen JSON-Thema geschrieben - ist das nun erledigt?


tomycat - Mi 09.06.21 12:36

vielen viele Dank an euch nochmal.
Es lag an WriteLine noch.
Man könnte meine ihr habt die Sprache C# entwickelt.
Ihr habt echt Ahnung, Respekt !!!