NEWS
[gelöst] JSON Array - bestimmte Postion suchen, wegschreiben
-
@metaxa Warum nutzt Du nicht JSONATA - das kann man auch von Blockly nutzen und ist dafür prädestiniert.
Ich zeigs Dir für die ID 1469126.
Egal wo im Array dein Objekt mit der ID 1469126 steht, JSONATA sucht es Dir vollautomatisch raus.
Hier zum Import:
Ist total simpel der JSONATA Ausdruck:
$[id=1469126]
In Folge kannst Du nun auf alle Attribute des Objektes zugreifen. 10 mal effizienter als jeder Javascriptcode. Schau mal wie kurz das ist. Da braucht man keine Schleifen und nichts.
Auf die Attribute des Objektes kannst Du herkömlich zugreifen.
So hier nochmal das gesamte Blockly:
-
@wolfi913 sagte in JSON Array - bestimmte Postion suchen und wegschreiben:
@metaxa
Eine ganz, ganz, ganz grobe Idee
wie's evtl. funktionieren könnte.
Hab eine andere ID verwendet, da in Deinem JSON für den "Favoriten" keine Preise drin sind.Auch für dieses Beispiel sind ja die Preise in einem Array - hier zwar nur ein Preis. Aber auch hier kann man die Filterfunktion von JSONATA direkt verwenden:
In dem Preisarray wird also direkt das Element aus den Preisen, automatisch das Element selektiert mit dem label "Diesel" und aus diesem Segment gleich der Preis mit der Eigenschaft amount selektiert.
$.prices[label="Diesel"].amount
Also kann die Filterfunktion nicht nur auf top-Ebene, sondern auch auf jedes Array innerhalb eines Objektes angewandt werden.
-
@mickym
Coole Variante, ohne großes Brimorium
Hätte nur ne kurze Ergänzung
Bei den Werten unterprices
funktioniertAttribut von Objekt
nicht (da wird "undefined" zurückgeliefert). Da sollte m.M.n.JSONata Ausdruck
verwendet werden.
Und falls sich der Favorit mal ändert könnte es evtl. gleich mit einer Variable in den JSONataAusdruck übergeben werden und die evtl. aus einem Datenpunkt befüllt werden.
Edit: Sorry, hab Deine Ergänzung zu spät gesehen
-
@wolfi913 Na ich hab Dir ja die JSONATA Version gegeben. Das Attribut von Objekt prices alleine geht nicht, da das ein Array ist. Ich hab ja gerade gezeigt, wenn man mehrere Preise im Array hat, wie man nach dem Label das richtige Element selektiert.
-
@wolfi913 sagte in JSON Array - bestimmte Postion suchen und wegschreiben:
Edit: Sorry, hab Deine Ergänzung zu spät gesehen
Der Vorteil mit JSONATA das Preisarray zu durchsuchen ist, dass man so gleich über das Label aus dem Preisarray, das richtige Objekt selektieren kann. Leider ist in der Quelle das nicht enthalten. Aber ich zeigs mal in dem ich einfach noch einen Fakepreis dazu mache, um das zu verdeutlichen. Hier mal Super aus 2 Preisen selektiert
$.prices[label="Super"].amount
-
@wolfi913 sagte in JSON Array - bestimmte Postion suchen und wegschreiben:
Bei den Werten unter prices funktioniert Attribut von Objekt nicht (da wird "undefined" zurückgeliefert).
Man kann grundsätzlich natürlich auch auf die Eigenschaften der Objekte direkt mit JSONATA zugreifen.
Also statt Attribut "name" von Objekt, könnte man auch mit JSONATA und dem Objekt schreiben:
$.name
-
@mickym sagte in JSON Array - bestimmte Postion suchen und wegschreiben:
Man kann grundsätzlich natürlich auch auf die Eigenschaften der Objekte direkt mit JSONATA zugreifen.
Also statt Attribut "name" von Objekt, könnte man auch mit JSONATA und dem Objekt schreiben
Hatte ich in meinem "Schleifen-"Beispiel für @metaxa ja auch so gemacht. Ich versuch bei mir ohnehin immer beim JSONata-Baustein zu bleiben. Aber prinzipiell funktionieren bei dem Aufbau des gelieferten JSON für diesen Wert ja beide Bausteine; das JSON ist an der Stelle ja noch nicht verschachtelt.
-
WOW!!! Danke Euch beiden! Jetzt weiß ich, womit ich mich heute im Laufe des Tages beschäftigen werde.
JSONata --> kannte ich überhaupt nicht, gefällt mir sehr gut --> https://youtu.be/ZBaK40rtIBM?feature=shared
Ich darf mich für Rückfragen hier melden.
-
@metaxa sagte in JSON Array - bestimmte Postion suchen und wegschreiben:
WOW!!! Danke Euch beiden! Jetzt weiß ich, womit ich mich heute im Laufe des Tages beschäftigen werde.
JSONata --> kannte ich überhaupt nicht, gefällt mir sehr gut --> https://youtu.be/ZBaK40rtIBM?feature=shared
Ich darf mich für Rückfragen hier melden.
Ist am Anfang nicht immer ganz einfach, aber wenn man es mal verstanden hat, spart man sich unzählige Zeilen an Code.
Hier übrigens die Seite zur Originialdokumentation: https://docs.jsonata.org/overview
Und das allerbeste um es zu Lernen - öffne über try den Exerciser, da kann man die Ergebnisse sofort sehen.
Links kannst Du Deine Quelle - also Dein Objekt reinkopieren. Rechts oben Deinen Code und hast gleich im Fenster rechts unten das Ergebnis.
Hier mal ein Link mit Deinen Daten: https://try.jsonata.org/Q8_LE3emZ
Damit siehst Du auf Anhieb die Ergebnisse Deines Codes im Fenster rechts oben.
Das ganze sind quasi "vorhersagebare Abfragen": https://docs.jsonata.org/predicate (kannst du auch anhand des Beispiels dort sehen und beruht auf der Filterung in einem Array von Objekten, nach beliebigen Eigenschaften der Objekte).
Wenn Du dann etwas fortgeschrittener bist, dann kannst Du Dir so mit einer Zeile immer die günstigste Tankstelle raussuchen mit allen Angaben, die Du benötigst:
https://try.jsonata.org/KNRfYUkvsDas Schöne ist, dass Du nun einfach die Preise verändern kannst in Deiner Quelle links, um zu sehen, ob das richtige Objekt selektiert wird. Wenn es mehrere gibt, dann erhälst Du automatisch ein Array.
$.prices[amount=$min($$.prices[fuelType="DIE"].amount)].%
Und wenn Du Dir nur die Adresse aus dem obigen Beispiel ausgeben lassen willst, dann hängst Du das einfach an, an das Objekt bzw. erstellst Dir komplett neue Objekte.
https://try.jsonata.org/fKAASenDQ
Das erstellt Dir völlig neue Objekte mit der günstigsten Tankstelle bzgl. Diesel und gibt Dir als Objekt den Preis und die Adresse in aufbereiteter Form wieder.
$.prices[amount=$min($$.prices[fuelType="DIE"].amount)].%.{"name":name, "ort":location.postalCode & ' ' & location.city, "strasse": location.address, "dieselpreis" : prices[fuelType='DIE'].amount & ' €'}
Wenn 2 Tankstellen die günstigsten sind (ich hab einfach den Preis von der JET verändert), dann bekommst Du automatisch ein Array mit beiden Tankstellen
-
@mickym sagte in JSON Array - bestimmte Postion suchen und wegschreiben:
Ist am Anfang nicht immer ganz einfach
Hier noch einmal - wenn auch verspätet - ein grosses DANKE für deine detaillierten Erklärungen. Sie haben sehr viel Licht in meinen Fragentunnel gebracht
Ich habe mir final eine Mischung von herkömlichen und JOSNata Befehlen gebastelt, die ich hoffentlich noch in paar Monaten nachvollziehen kann. Geht auch sicher deutlich kürzer, aber für mich ist es gut so.
@mickym DANKE!