JSon auslesen

Für Fragen von Einsteigern und Programmieranfängern...
daveR
Beiträge: 5
Registriert: Mi 6. Jan 2021, 16:37

JSon auslesen

Beitrag von daveR »

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. :cry:

Kann mir jemand dabei helfen?


Mit freundlichen Grüßen
Dave

MmVisual
Beiträge: 1150
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 2.0.10 FPC 3.2)
CPU-Target: 32/64Bit

Re: JSon auslesen

Beitrag von MmVisual »

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; 

daveR
Beiträge: 5
Registriert: Mi 6. Jan 2021, 16:37

Re: JSon auslesen

Beitrag von daveR »

Danke, ich werd das mal versuchen.
Mit dem FindPath Befehl geht das wegen dem Punkt im Namen "1. symbol" gar nicht?

daveR
Beiträge: 5
Registriert: Mi 6. Jan 2021, 16:37

Re: JSon auslesen

Beitrag von daveR »

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.

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 786
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Winux (L 2.0.11 FPC 3.2)
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: JSon auslesen

Beitrag von fliegermichl »

Hallo zusammen,

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;
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

Code: Alles auswählen

    function Find(const key: TJSONStringType; out AValue: TJSONString): boolean;
Hat jemand eine Idee?

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 4436
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Niederösterreich
Kontaktdaten:

Re: JSon auslesen

Beitrag von af0815 »

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

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 786
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Winux (L 2.0.11 FPC 3.2)
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: JSon auslesen

Beitrag von fliegermichl »

Hat sich erledigt, hab nochmal fpcupdeluxe laufen lassen. Jetzt klappt das wieder.

daveR
Beiträge: 5
Registriert: Mi 6. Jan 2021, 16:37

Re: JSon auslesen

Beitrag von daveR »

Mein Problem besteht nach wie vor

PascalDragon
Beiträge: 222
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

Beitrag von PascalDragon »

daveR hat geschrieben:
Mi 6. Jan 2021, 17:48
Danke, ich werd das mal versuchen.
Mit dem FindPath Befehl geht das wegen dem Punkt im Namen "1. symbol" gar nicht?
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

charlytango
Beiträge: 237
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz 2.0 fixes FPC 3.2 fixes
CPU-Target: Win 32Bit, 64bit
Wohnort: Wien

Re: JSon auslesen

Beitrag von charlytango »

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.

daveR
Beiträge: 5
Registriert: Mi 6. Jan 2021, 16:37

Re: JSon auslesen

Beitrag von daveR »

charlytango hat geschrieben:
Fr 8. Jan 2021, 10:12
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.
Auf Eleganz kommt es ja nicht an wenn es als Einziges funktioniert :D

PS: I <3 U

Timm Thaler
Beiträge: 1172
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

Beitrag von Timm Thaler »

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.

mcgiver
Beiträge: 2
Registriert: Fr 8. Jan 2021, 14:44

Re: JSon auslesen

Beitrag von mcgiver »

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
Dateianhänge
Dave.zip
(334.49 KiB) 11-mal heruntergeladen

Benutzeravatar
six1
Beiträge: 310
Registriert: Do 1. Jul 2010, 19:01

Re: JSon auslesen

Beitrag von six1 »

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.

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

mcgiver
Beiträge: 2
Registriert: Fr 8. Jan 2021, 14:44

Re: JSon auslesen

Beitrag von mcgiver »

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
Dateianhänge
Michael.zip
(346.1 KiB) 9-mal heruntergeladen

Antworten