Vollständige Version anzeigen : [C#] JSON Daten abrufen und nur bestimmte key value paare speichern


iraki
16.01.2015, 14:14

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:
{"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:
var request = (HttpWebRequest)WebRequest;Create(";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:
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.

Hardware Preisvergleich | Amazon Blitzangebote!

Videos zum Thema
Video Loading...
Epidrome
16.01.2015, 15:31

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.


iraki
16.01.2015, 16:02

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.


Epidrome
16.01.2015, 16:26

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.


iraki
16.01.2015, 16:44

Okay, danke dir
//Edit:
Ich habe es mal nach dieser Anleitung gemacht:
c# - Parse JSON Array using Newtonsoft - Stack Overflow (;stackoverflow~com/questions/24388288/parse-json-array-using-newtonsoft)
Mein 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(";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


Epidrome
16.01.2015, 17:28

Okay, danke dir
//Edit:
Ich habe es mal nach dieser Anleitung gemacht:
c# - Parse JSON Array using Newtonsoft - Stack Overflow (;stackoverflow~com/questions/24388288/parse-json-array-using-newtonsoft)
Mein Code:
public class Weather
{
....
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


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.


Epidrome
16.01.2015, 18:40

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

Eingabe:
{"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#:

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:

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.


iraki
17.01.2015, 11:02

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 :)


Epidrome
17.01.2015, 21:01

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#:

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.


iraki
18.01.2015, 16:15

Hi,
jetzt liefert er komischerweise gar keine Werte mehr für temp_max und dt:, wenn ich das so umstelle :/


Epidrome
18.01.2015, 17:15

Hi,
probiere es damit.

C#:

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.


iraki
18.01.2015, 19:06

Leider auch keine werte enthalten


Epidrome
18.01.2015, 19:21

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.


iraki
20.01.2015, 15:33

Hey,
hier mal mein Beispiel. Mal in voller Länge:
(;api;openweathermap~org/data/2;5/history/city?q=Flensburg&type=hour&start=1420135249&end=1421085649)


Epidrome
20.01.2015, 15:57

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

Eingabedaten:

... "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#:

string pattern_3 = ;"(?<=temp_max"":)[^\""]*(?=,)";
string pattern_4 = ;"(?<=dt"":)[^\""]*(?=})";


damit habe ich einige Einträge aus dein Link getestet.

Link:
(;api;openweathermap~org/data/2;5/history/city?q=Flensburg&type=hour&start=1420135249&end=1421085649)

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

MFG Epi.


iraki
20.01.2015, 16:22

Hey tempmaxservice zeigt mir jetzt das richtige an, dtservice zeigt mir noch \r\n an arghh


Epidrome
20.01.2015, 16:32

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.

\r = CR (Carriage Return) // Used as a new line character in Mac OS before X
\n = LF (Line Feed) // Used as a new line character in Unix/Mac OS X
\r\n = CR + LF // Used as a new line character in Windows


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.


iraki
21.01.2015, 11:47

Hi,
ich hab jetzt mal mein Programm gepackt und hochgeladen:
Download: app_iraki;rar | ;;xup~in (;;;xup~in/dl,13758449/app_iraki;rar/)
ist halt eine Windows Store App (MVVM)

viele Grüße
J.


iraki
21.01.2015, 17:10

Ahh du, ich hab das jetzt so gelöst:
if (dtService;Contains("\r\n"))
{
var trimmed = dtService;Trim();
}


Epidrome
21.01.2015, 18:23

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

MFG Epi.


iraki
21.01.2015, 18:38

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?


Epidrome
21.01.2015, 19:22

Hi,
also Dictionary wie dein Mitbewohner gesagt hat hört sich gut. Habe mir das angeschaut und passt zu dein Projekt.
Deine Eingabedaten:

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


iraki
23.01.2015, 14:02

Hi,
hier mal ein Ausschnitt vom code jetzt:
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?


Epidrome
23.01.2015, 15:06

Hi,
schau dir die Links mal an.
Links:
(;msdn;microsoft~com/de-de/library/xfhwa508%28v=vs;110%29;aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-3)
(;;;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:
public class myGraphInfo
{
public Point Location { get; set; }
public string TextBlockText { get; set; }
public int BorderThickness { get; set; }
public Color BorderColor { get; set; }
public string BorderText { get; set; }
}


Fill in your data and push it into the dictionary such as:

Dictionary< Point, myGraphInfo > PlotData = new Dictionary< Point, myGraphInfo>;

...

PlotData;Add (pt1, new myGraphInfo() { Location = pt1, TextBlockText = "Jabberwocky" ... } )


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.

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.


Ähnliche Themen zu [C#] JSON Daten abrufen und nur bestimmte key value paare speichern
  • [Code] Datei öffnen, Bestimmte Stelle bearbeiten, Speichern
    ich wollte mich demnächst mal mit Delphi auserhalb der Schule beschäftigen und zwar wollt ich mir gezielt nen Patcher bauen der ne Sample Datei öffnet da was ändert und diese anschließend wieder speichert unter dem namen denn man in nen input Feld eingeben kann. Fixende Posi sind bekannt. Ic [...]

  • [Java] Bestimmte Teile aus Text auslesen und Speichern
    Hey, ich habe folgendes Problem was ich gerne, möglichst mit einem java-applet realisieren möchte. Ich würde gerne einen TEXT A eingeben/einlesen indem es bestimmte Daten gibt die immer gleich gekennzeichnet sind. z;B kommt im Text öfters der Ausdruck car="xyz" vor. Diese xyz's sollen jetz [...]

  • [C/C++] strings aus datei suchen in externe datei speichern und abrufen
    Hi, ich bin verzweifelt auf der Suche nach Hilfe um folgendes zu lösen: 1. datei XYZ "öffnen&einlesen" / initialisieren 2. jede Zeile einzeln, bis auf ersten 7 Zeichen und bis zum nächsten "/"-Zeichen in externe datei speichern 3. jede zeile aus externer datei als array-element initialis [...]

  • [XP] Emailadressen speichern und abrufen beim Login - Firefox
    Folgendes Problem: Bei mir am Rechner werden wenn man sich einloggt die Emailadressen abgespeichert, auch wenn man den Haken bei "Passwort merken" nicht setzt. Wie kann ich diese abgespeicherten Emailadressen abrufen? Sie werden manchmal aufgelistet wenn ich ins Email-Eingabefenster klicke, aber ir [...]



raid-rush.ws | Imprint & Contact pr