JSon auslesen
JSon auslesen
Guten Abend!
Ich möchte aus einer Json Datei einer API das Element "1. symbol" auslesen, also den String "Tesco" erhalten.
Hier ein Auszug aus der Datei:
{
"bestMatches": [
{
"1. symbol": "TESO",
"2. name": "Tesco Corporation USA",
"3. type": "Equity",
"4. region": "United States",
"5. marketOpen": "09:30",
"6. marketClose": "16:00",
"7. timezone": "UTC-05",
"8. currency": "USD",
"9. matchScore": "0.8889"
}
Habe es so probiert:
Result:=DataSS.FindPath('bestMatches[0].1. symbol').AsString;
das funktioniert aber nicht. Auch die Variante ohne Leerzeichen klappt nicht.
Kann mir jemand dabei helfen?
Mit freundlichen Grüßen
Dave
Ich möchte aus einer Json Datei einer API das Element "1. symbol" auslesen, also den String "Tesco" erhalten.
Hier ein Auszug aus der Datei:
{
"bestMatches": [
{
"1. symbol": "TESO",
"2. name": "Tesco Corporation USA",
"3. type": "Equity",
"4. region": "United States",
"5. marketOpen": "09:30",
"6. marketClose": "16:00",
"7. timezone": "UTC-05",
"8. currency": "USD",
"9. matchScore": "0.8889"
}
Habe es so probiert:
Result:=DataSS.FindPath('bestMatches[0].1. symbol').AsString;
das funktioniert aber nicht. Auch die Variante ohne Leerzeichen klappt nicht.
Kann mir jemand dabei helfen?
Mit freundlichen Grüßen
Dave
-
- Beiträge: 1466
- Registriert: Fr 10. Okt 2008, 23:54
- OS, Lazarus, FPC: Winuxarm (L 3.0 FPC 3.2)
- CPU-Target: 32/64Bit
Re: JSon auslesen
Das sollte so gehen:
Code: Alles auswählen
Var J: TJSONData;
J := GetJSON(sDerJSonText);
For iJ := 0 To J.Count - 1 Do
Begin
If J.JSONType In [jtObject] Then
Begin
If SameText('1. symbol', TJSONObject(J).Names[iJ]) Then
Begin
s2 := J.Items[iJ].AsString;
break;
End;
End;
End;
EleLa - Elektronik Lagerverwaltung - www.elela.de
Re: JSon auslesen
Danke, ich werd das mal versuchen.
Mit dem FindPath Befehl geht das wegen dem Punkt im Namen "1. symbol" gar nicht?
Mit dem FindPath Befehl geht das wegen dem Punkt im Namen "1. symbol" gar nicht?
Re: JSon auslesen
So hab das heute mal probiert. Der Code funktioniert, jedoch wird das Textelement nicht gefunden. Ich denke das hat mit dem Punkt zu tun. An anderen Stellen funktioniert das auslesen ja ganz gut.
- fliegermichl
- Lazarusforum e. V.
- Beiträge: 1435
- Registriert: Do 9. Jun 2011, 09:42
- OS, Lazarus, FPC: Lazarus Fixes FPC Stable
- CPU-Target: 32/64Bit
- Wohnort: Echzell
Re: JSon auslesen
Hallo zusammen,
ich hab da auch ein recht merkwürdiges Problem.
Das compiliert mit 64 Bit problemlos und funktioniert auch. Wenn ich 32 Bit compilieren will, bekomme ich bei j.find die Fehlermeldung
Error: Incompatible type for arg no. 2: Got "TJSONString", expected "TJSONtype"
Klicke ich find mit gedrückter Strg-Taste an, springt der Editor zu
Hat jemand eine Idee?
ich hab da auch ein recht merkwürdiges Problem.
Code: Alles auswählen
procedure x(j : TJSONData);
var
s : TJSONString;
begin
if (j.Find('result', s)) then
writeln(s.asString);
end;
Error: Incompatible type for arg no. 2: Got "TJSONString", expected "TJSONtype"
Klicke ich find mit gedrückter Strg-Taste an, springt der Editor zu
Code: Alles auswählen
function Find(const key: TJSONStringType; out AValue: TJSONString): boolean;
- af0815
- Lazarusforum e. V.
- Beiträge: 6209
- Registriert: So 7. Jan 2007, 10:20
- OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
- CPU-Target: 32Bit (64Bit)
- Wohnort: Burgenland
- Kontaktdaten:
Re: JSon auslesen
Wirklich clean compilieren. Ich habe solche Sachen gerne nach einem Update. Wenn sich an der Deklaration sich was ändert und eine ppu noch herumhängt. Ich lösche dann auch die ppu und andere kompilate und meistens gehts.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
- fliegermichl
- Lazarusforum e. V.
- Beiträge: 1435
- Registriert: Do 9. Jun 2011, 09:42
- OS, Lazarus, FPC: Lazarus Fixes FPC Stable
- CPU-Target: 32/64Bit
- Wohnort: Echzell
Re: JSon auslesen
Hat sich erledigt, hab nochmal fpcupdeluxe laufen lassen. Jetzt klappt das wieder.
Re: JSon auslesen
Mein Problem besteht nach wie vor
-
- Beiträge: 830
- Registriert: Mi 3. Jun 2020, 07:18
- OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
- CPU-Target: Aarch64 bis Z80 ;)
- Wohnort: München
Re: JSon auslesen
Korrekt. Der Punkt wird von FindPath als Separator verwendet und wenn der also im Namen eines Felds vorkommt, dann kann der Code das nicht behandeln. Du könntest einen Bug Report erstellen, aber das hilft dir für dein konkretes Problem natürlich nicht, sondern nur für die Zukunft.
FPC Compiler Entwickler
-
- Beiträge: 843
- Registriert: Sa 12. Sep 2015, 12:10
- OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
- CPU-Target: Win 32/64, Linux64
- Wohnort: Wien
Re: JSon auslesen
Hmm... als Workaround vielleicht einfach mal '. ' (Punkt+Leerzeichen) gegen einen Underscore (_) ersetzen dann kann man die Problematik mit dem Punkt als Trenner umgehen.
Nicht elegant aber möglich.
Nicht elegant aber möglich.
Re: JSon auslesen
Auf Eleganz kommt es ja nicht an wenn es als Einziges funktioniertcharlytango hat geschrieben: ↑Fr 8. Jan 2021, 10:12Hmm... als Workaround vielleicht einfach mal '. ' (Punkt+Leerzeichen) gegen einen Underscore (_) ersetzen dann kann man die Problematik mit dem Punkt als Trenner umgehen.
Nicht elegant aber möglich.
PS: I <3 U
-
- Beiträge: 1224
- Registriert: So 20. Mär 2016, 22:14
- OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
- CPU-Target: Raspberry Pi 3
Re: JSon auslesen
Wahrscheinlich hat man sich nicht vorstellen können, dass jemand so blöde Bezeichner verwendet.
Aber der Standard läßt es anscheinend zu.
Kann man den Punkt eventuell escapen? Oder Punkt und Leerzeichen vorher entfernen. Der Bezeichner wäre dann immer noch eindeutig.
Aber der Standard läßt es anscheinend zu.
Kann man den Punkt eventuell escapen? Oder Punkt und Leerzeichen vorher entfernen. Der Bezeichner wäre dann immer noch eindeutig.
Re: JSon auslesen
Hallo Forum, Hallo Dave,
...seid alle gegrüsst...
ich bin neu hier und versuche auch z.Z. grössere JsonFiles einzulesen.Von Lazarus und Json habe ich nur wenig bis keine Ahnung.
Allerdings hatte ich mich vor recht langer Zeit schonmal mit Delphi beschäftigt.
Im Anhang ist zu Dave's Problem auch noch eine kleine Quick&Dirty-Lösung...
...aber bitte nur das von mir komplettierte JsonFile "dave_r.json"(liegt bei) laden...
Edit :
ich weis nicht ob es etwas ausmacht - das Beispiel ist unter Linux erstellt...
lg
kalli
...seid alle gegrüsst...
ich bin neu hier und versuche auch z.Z. grössere JsonFiles einzulesen.Von Lazarus und Json habe ich nur wenig bis keine Ahnung.
Allerdings hatte ich mich vor recht langer Zeit schonmal mit Delphi beschäftigt.
Im Anhang ist zu Dave's Problem auch noch eine kleine Quick&Dirty-Lösung...
...aber bitte nur das von mir komplettierte JsonFile "dave_r.json"(liegt bei) laden...
Edit :
ich weis nicht ob es etwas ausmacht - das Beispiel ist unter Linux erstellt...
lg
kalli
- Dateianhänge
-
- Dave.zip
- (334.49 KiB) 82-mal heruntergeladen
Re: JSon auslesen
Ich habe Wetterdaten über XML ausgewertet. Jetzt dachte ich, ich probiere es mal über diese json Funktion.
Bekomme es nicht hin, auf die drei Wetterdaten zuzugreifen.
Bekomme es nicht hin, auf die drei Wetterdaten zuzugreifen.
Code: Alles auswählen
{"cod":"200","message":0,"cnt":3,"list":[{"dt":1610107200,"main":{"temp":1.43,"feels_like":-2.92,"temp_min":1.16,"temp_max":1.43,"pressure":1015,"sea_level":1015,"grnd_level":991,"humidity":90,"temp_kf":0.27},"weather":[{"id":600,"main":"Snow","description":"Mäßiger Schnee","icon":"13d"}],"clouds":{"all":100},"wind":{"speed":3.37,"deg":269},"visibility":3016,"pop":0.78,"snow":{"3h":0.83},"sys":{"pod":"d"},"dt_txt":"2021-01-08 12:00:00"},{"dt":1610118000,"main":{"temp":1.43,"feels_like":-2.28,"temp_min":1.36,"temp_max":1.43,"pressure":1016,"sea_level":1016,"grnd_level":991,"humidity":93,"temp_kf":0.07},"weather":[{"id":600,"main":"Snow","description":"Mäßiger Schnee","icon":"13d"}],"clouds":{"all":100},"wind":{"speed":2.56,"deg":263},"visibility":3042,"pop":0.45,"snow":{"3h":0.3},"sys":{"pod":"d"},"dt_txt":"2021-01-08 15:00:00"},{"dt":1610128800,"main":{"temp":0.93,"feels_like":-2.44,"temp_min":0.88,"temp_max":0.93,"pressure":1018,"sea_level":1018,"grnd_level":993,"humidity":95,"temp_kf":0.05},"weather":[{"id":600,"main":"Snow","description":"Mäßiger Schnee","icon":"13n"}],"clouds":{"all":99},"wind":{"speed":2.02,"deg":262},"visibility":4633,"pop":0.42,"snow":{"3h":0.16},"sys":{"pod":"n"},"dt_txt":"2021-01-08 18:00:00"}],"city":{"id":2938912,"name":"Darmstadt","coord":{"lat":49.8333,"lon":8.6667},"country":"DE","population":3792941,"timezone":3600,"sunrise":1610090478,"sunset":1610120545}}
Gruß, Michael
Re: JSon auslesen
Hallo Michael,
ich muss doch leicht schmunzeln...
Da du ja hier schon mehr als 10 Jahre unterwegs bist kann ich nicht glauben das du die WetterDaten nicht mal eben auslesen kannst.
Ich denke eher das du es OOP gerecht machst und mir nur auf den Zahn fühlen möchtest.
Von Objecten schreiben - bin ich aber noch mehr als weit entfernt - ich fange ja grad' erst an...hab' also wirklich noch keine Ahnung...
Warum habe ich dieses Beispiel für TE Dave gemacht ???
Dave hat versucht mit der Methode "FindPath" auf die ArrayElemente zu zugreifen...siehe ganz oben...
Bei der Art von Keys klappt das nicht - warum wurde bereits erwähnt.
Ich wollte eigentlich nur helfen und zeigen, dass es auch anders geht - mehr nicht...
Ein funktionierendes Beispiel hilft meiner Meinung nach mehr als jede pauschale Aussage wie - mach' so oder so...
vor allem - wenn man noch keine grossartigen Kenntnisse hat. Zur Erinnerung : Jeder hat mal angefangen - auch die Cracks...
Wer richtig liest - dem wäre auch folgendes aufgefallen :
###############
Im Anhang ist zu Dave's Problem auch noch eine kleine Quick&Dirty-Lösung...
...aber bitte nur das von mir komplettierte JsonFile "dave_r.json"(liegt bei) laden...
###############
Wenn man dann nun dahergeht und eine andere JsonStructur darein packt - knallt es unweigerlich -
da ich fast keine Fehleingaben abgefangen habe - für ein kleines Beispiel ist soetwas aber auch nicht von Nöten...
Wer bin ich und warum will ich diese JsonStructuren überhaupt zerpflücken ???
Ich bin 0x 82 65 6E 74 6E 65 72 und über 0b 00111100 Jahre jung und mache es zum Einen aus Spass an der Freude
und zum Anderen weil ich den Umgang damit erlernen möchte.
Und -- ich habe eine App für meine kleine HomeAutomation welche mit JasonFiles konfiguriert wird.
Mit dieser App steuere ich meine komplette Gartenbeleuchtung per DMX,wichtige Aktoren per Can-Bus,andere per MQTT...
HardWare ist z.Z ein BeagleBoneBlack mit Archlinux und PythonServer sowie ein RPI4 mit Archlinux und IOBroker...
Leider gibt es den OnlineEditor nur noch bis Ende diesen Jahres - die Autoren der App hören auf...die Seite schliesst...
Ich suche deshalb nach eine guten Alternative - welche es z.Z. noch nicht gibt...
Mir ist schon klar das es fertige JsonParser gibt und auch das man TMemo,TStringList und co. benutzen kann um die Daten auszulesen...
aber es ist halt sehr unkonfortabel und Fehleranfällig in der ganzen JsonStructur herum zu frickeln um Änderungen etc. zu machen.
Also können Objecte hier nur das Ziel sein - aber irgendwo muss man ja anfangen.
OK - das soll genug sein...
Meine Hausaufgaben habe ich auch gemacht - danke dafür.
Anbei ist ein Beispiel wie man die drei WetterDaten auslesen könnte.
Auf Schönheit etc. habe ich hier nicht mehr geachtet (nur Ablaufsteuerung ) - da es eh' im Müll landet...
Als Schmankerl habe ich dir aber noch ein kleines Array (weather ) übrig gelassen.
Vielleicht hast du ja den Ehrgeiz und zeigst mir wie man darauf Sinnvoll zugreift.
Eine Frage noch zum Schluss :
das Memo zeigt das : dt_txt
das Label zeigt das : dt txt
...es fehlt also der Unterstrich - warum ??? --- die Fonts sind gleich...
Ich weise extra darauf hin :
Bitte nur das beigefügte "michael.json" laden - sonst knallt es...
da ich keine Fehlerbehandlung gemacht habe.
Viele liebe Grüsse
kalli
ich muss doch leicht schmunzeln...
Da du ja hier schon mehr als 10 Jahre unterwegs bist kann ich nicht glauben das du die WetterDaten nicht mal eben auslesen kannst.
Ich denke eher das du es OOP gerecht machst und mir nur auf den Zahn fühlen möchtest.
Von Objecten schreiben - bin ich aber noch mehr als weit entfernt - ich fange ja grad' erst an...hab' also wirklich noch keine Ahnung...
Warum habe ich dieses Beispiel für TE Dave gemacht ???
Dave hat versucht mit der Methode "FindPath" auf die ArrayElemente zu zugreifen...siehe ganz oben...
Bei der Art von Keys klappt das nicht - warum wurde bereits erwähnt.
Ich wollte eigentlich nur helfen und zeigen, dass es auch anders geht - mehr nicht...
Ein funktionierendes Beispiel hilft meiner Meinung nach mehr als jede pauschale Aussage wie - mach' so oder so...
vor allem - wenn man noch keine grossartigen Kenntnisse hat. Zur Erinnerung : Jeder hat mal angefangen - auch die Cracks...
Wer richtig liest - dem wäre auch folgendes aufgefallen :
###############
Im Anhang ist zu Dave's Problem auch noch eine kleine Quick&Dirty-Lösung...
...aber bitte nur das von mir komplettierte JsonFile "dave_r.json"(liegt bei) laden...
###############
Wenn man dann nun dahergeht und eine andere JsonStructur darein packt - knallt es unweigerlich -
da ich fast keine Fehleingaben abgefangen habe - für ein kleines Beispiel ist soetwas aber auch nicht von Nöten...
Wer bin ich und warum will ich diese JsonStructuren überhaupt zerpflücken ???
Ich bin 0x 82 65 6E 74 6E 65 72 und über 0b 00111100 Jahre jung und mache es zum Einen aus Spass an der Freude
und zum Anderen weil ich den Umgang damit erlernen möchte.
Und -- ich habe eine App für meine kleine HomeAutomation welche mit JasonFiles konfiguriert wird.
Mit dieser App steuere ich meine komplette Gartenbeleuchtung per DMX,wichtige Aktoren per Can-Bus,andere per MQTT...
HardWare ist z.Z ein BeagleBoneBlack mit Archlinux und PythonServer sowie ein RPI4 mit Archlinux und IOBroker...
Leider gibt es den OnlineEditor nur noch bis Ende diesen Jahres - die Autoren der App hören auf...die Seite schliesst...
Ich suche deshalb nach eine guten Alternative - welche es z.Z. noch nicht gibt...
Mir ist schon klar das es fertige JsonParser gibt und auch das man TMemo,TStringList und co. benutzen kann um die Daten auszulesen...
aber es ist halt sehr unkonfortabel und Fehleranfällig in der ganzen JsonStructur herum zu frickeln um Änderungen etc. zu machen.
Also können Objecte hier nur das Ziel sein - aber irgendwo muss man ja anfangen.
OK - das soll genug sein...
Meine Hausaufgaben habe ich auch gemacht - danke dafür.
Anbei ist ein Beispiel wie man die drei WetterDaten auslesen könnte.
Auf Schönheit etc. habe ich hier nicht mehr geachtet (nur Ablaufsteuerung ) - da es eh' im Müll landet...
Als Schmankerl habe ich dir aber noch ein kleines Array (weather ) übrig gelassen.
Vielleicht hast du ja den Ehrgeiz und zeigst mir wie man darauf Sinnvoll zugreift.
Eine Frage noch zum Schluss :
das Memo zeigt das : dt_txt
das Label zeigt das : dt txt
...es fehlt also der Unterstrich - warum ??? --- die Fonts sind gleich...
Ich weise extra darauf hin :
Bitte nur das beigefügte "michael.json" laden - sonst knallt es...
da ich keine Fehlerbehandlung gemacht habe.
Viele liebe Grüsse
kalli
- Dateianhänge
-
- Michael.zip
- (346.1 KiB) 84-mal heruntergeladen