[C#] JSON Daten abrufen und nur bestimmte key value paare speichern

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von iraki, 16. Januar 2015 .

  1. 16. Januar 2015
    Zuletzt bearbeitet: 16. Januar 2015
    Hallo Moin,
    ich versuche zur Zeit für ein FH Projekt mithilfe von JSON.Net Wetterdaten von openweathermap.org abzurufen und aus dem JSON String nur die Temperaturen zu filtern. Der Ausgangs JSON string sähe so aus:
    Code:
    {"message":"","cod":"200","city_id":2926271,"calctime":0.0399,"cnt":14,"list":[{"weather":[{"id":803,"main":"Clouds","description":"broken clouds","icon":"04d"}],"main":{"temp":286.26,"pressure":1007,"humidity":87,"temp_min":285.15,"temp_max":287.59},"wind":{"speed":3.6,"deg":110},"clouds":{"all":75},"dt":1369731600}
    Mein jetziger Code sieht so aus:
    Code:
     var request = (HttpWebRequest)WebRequest.Create("http://api.openweathermap.org/data/2.5/history/city? q=SampleTown&type=day&start=1369728000&end=1369789200");
     var response = await request.GetResponseAsync();
     var rawJson = new StreamReader(response.GetResponseStream()).ReadToEnd();
    
     dynamic data = JsonConvert.DeserializeObject(rawJson);
     dynamic list = data["list"];
     string stringList = Convert.ToString(list);
    Nun ist die Frage, wie bekomme ich aus dem obrigen String temp, temp_max, Temp_min und dt und die dazugehörigen Werte heraus.
    Vielen Dank schon mal.

    viele Grüße
    J.

    Edit:
    Ich habe es nun folgendermaßen probiert:
    Code:
    dynamic data = JsonConvert.DeserializeObject(rawJson);
     string temp = data.temp;
    Problem ist, dass im string temp nichts drin steht. Aber in dynamic data eindeutig temp enthalten ist. "cnt" nimmt er und schreibt den value in temp rein.
     
  2. 16. Januar 2015
    AW: [C#] JSON Daten abrufen und nur bestimmte key value paare speichern

    Hi,

    da du an der FH bist und so ein Projekt hast, gehe ich davon aus das du dich auskennst.
    Das auslesen von Daten in deinen Fall wurde ich mit regex (regular expression) machen.
    Dann bekommst du die werte ob was drin steht oder nicht.
    WErde versuchen einen Beispiel in C# zu machen.
    MFG Epi.
     
  3. 16. Januar 2015
    AW: [C#] JSON Daten abrufen und nur bestimmte key value paare speichern

    Hey ja mit Regex habe ich es versucht, aber habe leider keine guten Ergebnisse erziehen können. Da aber der Parser bzw. DeserializeObject bessere und leichtere Ergebnisse erzielen sollte, hatte ich diesen gewählt. Der Grund das temp keine Werte in dem Fall liefert, müsste, so habe ich es eben herausgefunden, daran liegen, das der Wert temp in dem Array List steht. Die Frage ist wie ich darein komme.
     
  4. 16. Januar 2015
    AW: [C#] JSON Daten abrufen und nur bestimmte key value paare speichern

    Mhh kannst du mir dein Code schicken?
    Dann hätte ich da was wo ich weiter sehen kann und vielleicht was erweitern kann.

    Edit:
    Ich werde das mit regex machen dann schicke ich dir das.
     
  5. 16. Januar 2015
    AW: [C#] JSON Daten abrufen und nur bestimmte key value paare speichern

    Okay, danke dir
    //Edit:
    Ich habe es mal nach dieser Anleitung gemacht:
    c# - Parse JSON Array using Newtonsoft - Stack Overflow
    Mein Code:
    Code:
     public class Weather
     {
     public int id { get; set; }
     public string main { get; set; }
     public string description { get; set; }
     public string icon { get; set; }
     }
     public class Wind
     {
     public double speed { get; set; }
     public int deg { get; set; }
     }
    
     public class Clouds
     {
     public int all { get; set; }
     }
    
     public class List
     {
     public List<Weather> weather { get; set; }
     public Main main { get; set; }
     public Wind wind { get; set; }
     public Clouds clouds { get; set; }
     public int dt { get; set; }
     }
     public class Main
     {
     public double temp { get; set; }
     public int pressure { get; set; }
     public int humidity { get; set; }
     public double temp_min { get; set; }
     public double temp_max { get; set; }
     }
     public class RootObject
     {
     public List<Main> Main { get; set; }
     }
     class ViewModel
     {
     public List<DataItem> Items { get; set; }
    
    
     public async void Refresh()
     {
     var request = (HttpWebRequest)WebRequest.Create("http://api.openweathermap.org/data/2.5/history/city?q=exampleTown&type=day&start=1369728000&end=1369789200");
     var response = await request.GetResponseAsync();
     var rawJson = new StreamReader(response.GetResponseStream()).ReadToEnd();
    
     RootObject ro = JsonConvert.DeserializeObject<RootObject>(rawJson);
    
     foreach (var item in ro.Main)
     {
     string _temp = temp; <--Hier ist das Problem
     }
    Das Problem: The name 'temp' does not exist in the current context
     
  6. 16. Januar 2015
    AW: [C#] JSON Daten abrufen und nur bestimmte key value paare speichern

    string _temp bekommt einen wert von temp zugewisen.
    Du schreibst aber nichts in deine Methode in der Class ViewModel in der variable temp.
    temp ist nicht mal als variable deklariert.

    =================================
    Und viele Sachen werden bei mir von Visual Studio Ulitmate nicht erkannt.
     
  7. 16. Januar 2015
    AW: [C#] JSON Daten abrufen und nur bestimmte key value paare speichern

    Hi,
    hier meine Lösung mit regex angepasst an deine Eingabe.

    Eingabe:
    Code:
    {"message":"","cod":"200","city_id":2926271,"calctime":0.0399,"cnt":14,"list":[{"weather":[{"id":803,"main":"Clouds","description":"broken clouds","icon":"04d"}],"main":{"temp":286.26,"pressure":1007,"humidity":87,"temp_min":285.15,"temp_max":287.59},"wind":{"speed":3.6,"deg":110},"clouds":{"all":75},"dt":1369731600}
    Variable input beinhaltet deine Eingabe.
    C#:
    Code:
     
     using System.Text.RegularExpressions;
    ...
    ...
    ... 
     string pattern_1 = @"(?<=temp"":)[^\""]*(?=,)";
     string pattern_2 = @"(?<=temp_min"":)[^\""]*(?=,)";
     string pattern_3 = @"(?<=temp_max"":)[^\""]*(?=},)";
     string pattern_4 = @"(?<=dt"":)[^\""]*(?=})";
    
     Match match_1 = Regex.Match(input, pattern_1);
     Match match_2 = Regex.Match(input, pattern_2);
     Match match_3 = Regex.Match(input, pattern_3);
     Match match_4 = Regex.Match(input, pattern_4);
    
     // Ich schreibe hier meine ausgabe in labels, da ich GUI entwickelt habe.
     label1.Text = match_1.Value; // 286.26 
     label2.Text = match_2.Value; // 285.15 
     label3.Text = match_3.Value; // 287.59 
     label4.Text = match_4.Value; // 1369731600 
    
    Ausgabe:
    Code:
    286.26
    285.15
    287.59
    1369731600
    
    Ich habe mit Absicht so hin geschrieben damit du siehst welche pattern zu welche Ausgabe gehören.
    Das kann man später schöner programmieren mit array etc... immer an eigene wünsche anpassen.

    MFG Epi.
     
  8. 17. Januar 2015
    Zuletzt bearbeitet: 17. Januar 2015
    AW: [C#] JSON Daten abrufen und nur bestimmte key value paare speichern

    Ja hammer, vielen Dank dir schon mal Falls ich noch Fragen habe, schreibe ich die hier rein
    //Edit: Leider packt er mir bei temp_max und dt immer "\r\n" ran. Jetzt überlege ich außerdem noch wie ich alle Werte aus dem json file speichere, es gibt ja mehrere temps. Ist mein Ansatz richtig erstmal ein Array zu instanzieren und mit einer foreach die Werte in ein Array zu packen? Da ist natürlich die Frage wie viele Felder ich dem Array zuschreibe und ob ich ein mehrdimensionales brauche.
    Vielen Dank dir schonmal
     
  9. 17. Januar 2015
    Zuletzt bearbeitet: 17. Januar 2015
    AW: [C#] JSON Daten abrufen und nur bestimmte key value paare speichern

    Hi,
    also warum du "bei temp_max und dt immer "\r\n" bekommst liegt daran das die Eingabedaten die du mir gegeben hast und die Eingabedaten aus json unterschiedlich sind.

    Versuche das hier mal, habe das mal so erweitert.
    C#:
    Code:
     string pattern_3 = @"(?<=temp_max"":)[^\""]*(?=\r\n},)";
     string pattern_4 = @"(?<=dt"":)[^\""]*(?=\r\n})";
    
    Leider kann ich es nicht sagen ob es funktioniert, da ich es in meine Version - deine Eingabedaten nicht einbauen kann.


    Du kannst das Natürlich alle Ergebnisse in Array schreiben und hast später nur einen Array die du lesen musst und nicht z.B. 12 Variablen. Als Programmierer hast du die Wahl und es kommt drauf an wie es bei dir später weiter gehen soll.
    Wenn du viele verschiedene Methoden etc... hast und du immer zwischen temp, temp_min, temp_max, tamp_k.a ... wechseln muss, dann sollte du das mit ein globalen Array das einfacher haben.

    Falls fragen zu diesen Thread gibt, dann ja kannst du gern fragen ich schau mir meine Beiträge immer an wenn ich es schaffe. Also hier und nicht mit PN da ich unterwegs nicht eingeloggt bin.

    MFG Epi.
     
  10. 18. Januar 2015
    AW: [C#] JSON Daten abrufen und nur bestimmte key value paare speichern

    Hi,
    jetzt liefert er komischerweise gar keine Werte mehr für temp_max und dt:, wenn ich das so umstelle :/
     
  11. 18. Januar 2015
    Zuletzt bearbeitet: 18. Januar 2015
    AW: [C#] JSON Daten abrufen und nur bestimmte key value paare speichern

    Hi,
    probiere es damit.

    C#:
    Code:
     string pattern_3 = @"(?<=temp_max"":)[^\""]*(?=\\r\\n},)";
     string pattern_4 = @"(?<=dt"":)[^\""]*(?=\\r\\n})";
    
    Ich kann blöderweise deinen Fehler bei mir nicht erzeugen.
    Hoffe das diese Lösung jetzt geht.
     
  12. 18. Januar 2015
    AW: [C#] JSON Daten abrufen und nur bestimmte key value paare speichern

    Leider auch keine werte enthalten
     
  13. 18. Januar 2015
    AW: [C#] JSON Daten abrufen und nur bestimmte key value paare speichern

    Hi,
    sende mir mal bitte deine Eingabedaten und alles was Json am ende hat!!!
    Bei mir bringte er sogar mit eingebaute Fehler immer noch Ergebnisse.
     
  14. 20. Januar 2015
    AW: [C#] JSON Daten abrufen und nur bestimmte key value paare speichern

    Hey,
    hier mal mein Beispiel. Mal in voller Länge:
    http://api.openweathermap.org/data/2.5/history/city?q=Flensburg&type=hour&start=1420135249&end=1421085649
     
  15. 20. Januar 2015
    AW: [C#] JSON Daten abrufen und nur bestimmte key value paare speichern

    Hi,
    kein wunder das es nicht läuft .
    Du hast mir am Anfang folgende Eingabedaten gegeben:

    Eingabedaten:
    Code:
    ... "temp_max":287.59},"wind":{"speed":3.6,"deg":110},"clouds":{"all":75},"dt":1369731600}
    
    Bei temp_max steht hinter der Zahl eine } und damit habe ich gearbeitet .

    Meine Lösung jetzt,
    C#:
    Code:
     string pattern_3 = @"(?<=temp_max"":)[^\""]*(?=,)";
     string pattern_4 = @"(?<=dt"":)[^\""]*(?=})";
    
    damit habe ich einige Einträge aus dein Link getestet.

    Link:
    http://api.openweathermap.org/data/...urg&type=hour&start=1420135249&end=1421085649

    Also bei mir bringt er saubere Ergebnisse.
    Hier mal ein Bild wie es bei mir ausschaut

    MFG Epi.
     

    Anhänge:

    • c#.PNG
      Dateigröße:
      70,6 KB
      Aufrufe:
      405
  16. 20. Januar 2015
    AW: [C#] JSON Daten abrufen und nur bestimmte key value paare speichern

    Hey tempmaxservice zeigt mir jetzt das richtige an, dtservice zeigt mir noch \r\n an arghh
     
  17. 20. Januar 2015
    AW: [C#] JSON Daten abrufen und nur bestimmte key value paare speichern

    Hi,
    das kann nicht sein, dann liegt es an json.
    In dein Link tritt kein \r\n auf, also was ich gesehen habe überhaupt nicht - bei gar keine Zeile.
    Z.B.: dt:4711\r\n}
    Das wird von dein Programm irgendwo automatisch eingebaut.

    Also soweit könnte ich helfen, wenn du willst kannst mir dein ganzes Programm schicken wo dieses Problem auftaucht.
    Ich könnte dann genau schauen wo dieser Fehler ist.

    Wie du bei mein Bild siehst, tritt so etwas nicht auf, da ich Original Inhalte aus dem Link nehme.

    P.S.:
    Bei mein Bild siehst du das \r\n nach main": dran kommt.


    MFG Epic.
     
  18. 21. Januar 2015
    Zuletzt von einem Moderator bearbeitet: 14. April 2017
    AW: [C#] JSON Daten abrufen und nur bestimmte key value paare speichern

    Hi,
    ich hab jetzt mal mein Programm gepackt und hochgeladen:
    Download: app_iraki.rar | www.xup.in
    ist halt eine Windows Store App (MVVM)

    viele Grüße
    J.
     
  19. 21. Januar 2015
    AW: [C#] JSON Daten abrufen und nur bestimmte key value paare speichern

    Ahh du, ich hab das jetzt so gelöst:
    Code:
     if (dtService.Contains("\r\n"))
     {
     var trimmed = dtService.Trim();
     }
     
  20. 21. Januar 2015
    AW: [C#] JSON Daten abrufen und nur bestimmte key value paare speichern

    Hi,
    selbst gelöst ist am besten
    Dann weiter hin viel Glück mit dein FH-Projekt.

    MFG Epi.
     
  21. 21. Januar 2015
    AW: [C#] JSON Daten abrufen und nur bestimmte key value paare speichern

    Ja jetzt muss ich noch rausfinden, wie ich das am besten mit allen Werten hinbekomme, mein Mitbewohner meinte etwas mit Dictonary. Was schlägst du vor?
     
  22. 21. Januar 2015
    AW: [C#] JSON Daten abrufen und nur bestimmte key value paare speichern

    Hi,
    also Dictionary wie dein Mitbewohner gesagt hat hört sich gut. Habe mir das angeschaut und passt zu dein Projekt.
    Deine Eingabedaten:
    Code:
    {"main":{"temp":278.241,"temp_min":278.241,"temp_max":278.241,"pressure":1028.34,"sea_level":1030.72,"grnd_level":1028.34,"humidity":93},"wind":{"speed":11.86,"deg":227.501},"clouds":{"all":92},"weather":[{"id":500,"main":"Rain","description":"light rain","icon":"10n"}],"rain":{"3h":0.5},"dt":1420145084},
    {"main":{"temp":278.241,"temp_min":278.241,"temp_max":278.241,"pressure":1028.34,"sea_level":1030.72,"grnd_level":1028.34,"humidity":93},"wind":{"speed":11.86,"deg":227.501},"clouds":{"all":92},"weather":[{"id":500,"main":"Rain","description":"light rain","icon":"10n"}],"rain":{"3h":0.5},"dt":1420148893},
    {"main":{"temp":278.929,"temp_min":278.929,"temp_max":278.929,"pressure":1024.37,"sea_level":1026.68,"grnd_level":1024.37,"humidity":94},"wind":{"speed":12.73,"deg":230},"clouds":{"all":92},"weather":[{"id":500,"main":"Rain","description":"light rain","icon":"10n"}],"rain":{"3h":1.5},"dt":1420152375},
    {"main":{"temp":278.929,"temp_min":278.929,"temp_max":278.929,"pressure":1024.37,"sea_level":1026.68,"grnd_level":1024.37,"humidity":94},"wind":{"speed":12.73,"deg":230},"clouds":{"all":92},"weather":[{"id":500,"main":"Rain","description":"light rain","icon":"10n"}],"rain":{"3h":1.5},"dt":1420154857},
    {"main":{"temp":278.929,"temp_min":278.929,"temp_max":278.929,"pressure":1024.37,"sea_level":1026.68,"grnd_level":1024.37,"humidity":94},"wind":{"speed":12.73,"deg":230},"clouds":{"all":92},"weather":[{"id":500,"main":"Rain","description":"light rain","icon":"10n"}],"rain":{"3h":1.5},"dt":1420155885},
    {"main":{"temp":278.929,"temp_min":278.929,"temp_max":278.929,"pressure":1024.37,"sea_level":1026.68,"grnd_level":1024.37,"humidity":94},"wind":{"speed":12.73,"deg":230},"clouds":{"all":92},"weather":[{"id":500,"main":"Rain","description":"light rain","icon":"10n"}],"rain":{"3h":1.5},"dt":1420159425},
    {"main":{"temp":278.929,"temp_min":278.929,"temp_max":278.929,"pressure":1024.37,"sea_level":1026.68,"grnd_level":1024.37,"humidity":94},"wind":{"speed":12.73,"deg":230},"clouds":{"all":92},"weather":[{"id":500,"main":"Rain","description":"light rain","icon":"10n"}],"rain":{"3h":1.5},"dt":1420159461},
    {"main":{"temp":280.214,"temp_min":280.214,"temp_max":280.214,"pressure":1019.8,"sea_level":1022.09,"grnd_level":1019.8,"humidity":94},"wind":{"speed":14.12,"deg":234.002},"clouds":{"all":92},"weather":[{"id":501,"main":"Rain","description":"moderate rain","icon":"10n"}],"rain":{"3h":3.5},"dt":1420163040},
    
    Deine Eingabedaten haben den gleichen Format und als eindeutiges Schlüssel kannst du "dt" nehmen oder "id" oder wie auch immer .
    Hier musst du selber wissen wie du es machst da "id" mehrmals auftaucht, aber mit andere werten. Also vorher überlegen was du brauchst.
    Wollte erst Array vorschlagen wie immer , aber Dictionary ist viel besser, kannst einmal alles definieren und später einfach eintragen und auslesen.
    Und wie ich gelesen habe kannst du für jeden Eintrag einen eindeutigen Schlüssel definieren.
    Was dir später bei mögliche weitere Bearbeitung sehr viel hilft.


    MFG Epi.
     
  23. 23. Januar 2015
    AW: [C#] JSON Daten abrufen und nur bestimmte key value paare speichern

    Hi,
    hier mal ein Ausschnitt vom code jetzt:
    Code:
     var tempService = match_temp.Value;
     var dtService = match_dt.Value;
     var trimmedDt = dtService.Trim();
    
    
     Dictionary<string, string> tempDate = new Dictionary<string, string>();
     tempDate.Add(trimmedDt, tempService);
    So das Problem ist jetzt, wie kriege ich alle Werte in das Dictonary?
     
  24. 23. Januar 2015
    Zuletzt bearbeitet: 23. Januar 2015
    AW: [C#] JSON Daten abrufen und nur bestimmte key value paare speichern

    Hi,
    schau dir die Links mal an.
    Links:
    https://msdn.microsoft.com/de-de/li...?cs-save-lang=1&cs-lang=csharp#code-snippet-3
    http://www.dotnetperls.com/dictionary

    Jetzt habe ich gelesen das es bei Dictionary einen key und einen value gibt und standardmäßig nicht mehr.
    Hier habe ich mal ein Code gefunden.
    Zitat:
    In den oberen Zitat und code schreibt der Typ eine Klasse und verknüpft es mit Dictonary.
    Ich denke du kannst deine Klasse für dein temp_min,*_max etc... schreiben und dann in Dictionary einbauen. Hier wird dir die Möglichkeit mit der Klasse gegeben mehr als 1 value einzutragen.

    Was ich leider nicht wusste ist das für Dictionary begrenzt ist.

    P.S.: Wenn das alles nicht passt oder funktioniert dann Schreibe einen Array.
    Code:
     string[] arr = new string[3];
     // "temp_max, temp_min, temp_ka, dt"
     arr[0] = "278.241,278.241,278.241,1420145084";
     arr[1] = "255.201,255.201,255.201,1430145084";
     arr[2] = "245.100,278.120,278.120,1440145084";
    
    Es gibt sehr viele Möglichkeiten .

    MFG Epi.
     
  25. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.