NEWS
JSON Objekte in Liste
-
Damit funktioniert es auch so: ..
Ich bin verwirrt. Tut es eben nicht. Oben habe ich die Fehlermeldung dokumentiert.
-
@legro sagte: Tut es eben nicht.
Du musst das (ungültige) Objekt (JSON) korrigieren: Lösche Zeilen 3, 15, 17 und 30. Außerdem fehlt jeweils ein Komma hinter "Tarif1" und "Tarif2".
-
@legro sagte in JSON Objekte in Liste:
etzt wollte ich's wissen! Um das Ganze besser zu verstehen, habe ich die Objektnamen Tarif1, Tarif2 weggelassen .
Du darfst das nicht einfach weglassen. Jedes Objekt wird durch eine Eigenschaft festgelegt und die hast Du damit weggenommen.
Ein JSON Objekt wird durch geschweifte Klammern definiert, dabei besteht es aus verschiedenen Eigenschaften in Anführungszeichen und einem Wert, der durch einen Doppelpunkt getrennt ist.
-
Ich habe verstanden worin mein Fehler bestand. Die {..} um die Listenobjekte müssen weg, wenn diese Objekte keinen Namen (mehr) besitzen.
Aber es funktioniert noch immer nicht. Egal auf was ich selektiere, ich erhalte ich in den nachfolgenden Beispielen stets null.
Ebenso erhalte ich die Liste nicht mehr ausgegeben, wenn ich ..
Was mache ich nun schon wieder falsch?
-
@legro sagte: schon wieder falsch?
Zeig mal das JSON.
-
Es ist (hoffentlich) identisch mit dem von dir vorgeschlagenen JSON.
{ "Tarife": [ { "Name" : "Tarif1" "Energiepreis": 0.3963, "Intervall": { "Startwert": 0, "Endwert": 486303 }, "Zeitraum": { "Start": "2023-01-01", "Ende": "2023-06-30" } }, { "Name" : "Tarif2" "Energiepreis": 0.3328, "Intervall": { "Startwert": 486303, "Endwert": null }, "Zeitraum": { "Start": "2023-07-01", "Ende": "2024-06-30" } } ] }
Ich habe einen Verdacht ..
Damit die Selektion via "." anstelle von [Index] funktioniert, müssen die Listenobjekte benannt sein.
-
@legro sagte: identisch mit dem von dir vorgeschlagenen JSON.
@paul53 sagte in JSON Objekte in Liste:
Außerdem fehlt jeweils ein Komma hinter "Tarif1" und "Tarif2".
Zeilen 4, 16.
-
Hier mal die Definitionen, die Du verinnerlichen musst:
=======================================================================
Also ein ARRAY beginnt IMMER mit einer ECKIGEN Klammer und schließt mit einer ECKIGEN Klammer ab und die einzelnen Elemente werden durch ein Komma getrennt.=======================================================================
Also ein OBJEKT beginnt IMMER mit einer GESCHWEIFTEN Klammer und schließt mit einer GESCHWEIFTEN Klammer ab und die einzelnen Elemente werden durch ein Komma getrennt. Ein Element besteht immer aus einer Eigenschaft in Anführungszeichen und dann ein Doppelpunkt und dann dem Wert der Eigenschaft. So wie Du es zuerst gemacht hast.
=======================================================================
Und wie Du dann üben kannst - kannst an diesem Mammut Thread sehen.
-
@legro Und hier hängt es halt davon ab, ob Du mit Listen arbeiten willst oder nicht. Ich habe Dir ja den direkten Pfad gezeigt, weil ich den Umweg über Listen zu umständlich fand.
Ich empfehle Dir grundsätzlich so ein Tool wie: https://jsonformatter.org/ zu verwenden - da siehst Du schon auf den ersten Blick dass Du Dich verheddert hast.
was gefehlt hat, sind die beiden Kommas.
Habe ich im Screenshot markiert.
-
Es funktioniert. Es lag natürlich an den fehlenden Kommas.
VIELEN DANK FÜR EURE GEDULD UND GROßARTIGE HILFE
Ich versuche einmal eine Zusammenfassung ..
In Blockly funktioniert die in ARRAYs übliche Syntax zum Selektieren auf die einzelnen Elemente nicht mittels der Angabe [Index], sondern ebenfalls über "."
In den Anfängen hatte ich kodiert ..
Tarife[1].Name
Tarife[0].Intervall.Endwert
..Auf die Idee, dass hier, der Index zwischen zwei Punkten einzuschließen, es tut, bin ich nicht gekommen.
-
Hat sich erledigt.
-
@legro Ja das kannst Du auch nicht. Insbesondere nicht mit Blockly alleine, sondern wenn Du JSONATA verwendest - das ist eine geniale Bibliothek.
https://docs.jsonata.org/overview
-
Zum Formatieren von JSON-Ausdrücken nutze ich Visual Studio Code.
Wie kann man JSONata in ioBroker verwenden?
Unter Konvertierung habe ich dazu in Blockly den Baustein JSON Ausdruck .. gefunden. Ich probiere das mal aus.
-
@legro ich hab dir doch einen Screenshot gepostet mit einer Lösung und JSONATA. Zum Üben kannst Du übrigens auch das JSONATA try Fenster verwenden. Links die Eingangsdaten, rechts oben Dein Code, rechts unten das Ergebnis. Das ganze kann man auch abspeichern.
Schau mal : https://try.jsonata.org/8DLapvppx
-
Ich bin doch schon fleißig am Üben.
Mein erstes Ziel ..
.. habe ich schon erreicht.
Der JSONata-Block verhält sich ziemlich seltsam. Man kann ihn nicht anstelle von "Ergebnis" in der Summenbildung verwenden.
-
@legro Wenn Du JSONATA verwendest - dann brauchst Du alles andere nicht - ich habe Dir doch den Link geschickt. Wenn Du die Doku anschaust, dann referenzierst Du mit $ das aktuelle Objekt - ausserdem ist es geschickter mit JSONATA zu rechnen und lieber das Ergebnis als Liste ausgeben zu lassen.
Ich habe Dir doch unten den Link geschickt - da solltest Du doch das try Fenster mit Deinem Objekt bekommen haben. Um für jeden Tarif das Produkt von Preis und Startwert zu bekommen - machst Du das erst mal in JSONATA. Wenn Du Gesamtsumme haben willst geht das noch einfacher.
Der Link sollte Dir doch folgendes zeigen.
Um nun die Produkte der einzelnen Tarife zu bilden:
Du musst halt bissi üben, wenn Du Dich mit JSONATA beschäftigen willst.
Wie Du siehst wird nun für jeden Tarif das Produkt gebildet und in einem Array gespeichert. Das Ganze kannst Du dann auch noch aufsummieren.
Wenn Du das dann in JSONATA Fenster alles gemacht hast - dann referenzierst Du im Blockly das Objekt auf der linken Seite einfach mit $, wie in dem Code rechts oben.
Hier zum Import:
-
Vielen herzlichen Dank für deine freundliche und äußerst hilfreiche Unterstützung. Für mich ist es jedoch offenbar noch ein langer Weg, bis ich JSONata so gut beherrsche, dass ein Kodieren in JSONata schneller geht als mit Blockly.
Derzeit lese ich mich in die äußerst dürftige Dokumentation von JSONata ein. Allein schon bei dem Ausprobieren von $key, $lookup, $sum, .. begehe ich wohl typische Anfängerfehler, die mir den Spaß (noch) gründlich verderben. Aber ich will's tapfer weiter versuchen.
Mein erstes Ziel: Die Kosten für unseren Strombezug über alle Tarife hinweg zu ermitteln.
-
@legro Ja man muss das verstehen - hat bei mir auch länger gedauert. Mit der Formel unten sollte aber Dein Ziel zu erreichen sein. Wir können das ja mal durchgehen, wenn Du willst. Aber natürlich nur wenn Du willst.
-
Oh ja, sehr gerne. Ich melde mich mit meinen Versuchen.
-
@legro Du sollst es einfach in dem JSONATA try Fenster machen - da Du sofort das Ergebnis siehst. Wenn dann alles stimmt brauchst Du den Code nur rauskopieren und im Blockly als JSONATA Ausdruck verwenden.
Wie gesagt mit dem Code:
$.Tarife.*.(Energiepreis * Intervall.Startwert / 1000) ~> $sum()
hast Du alles was Du brauchst.
Gib einfach mal nur das $ ein und schau was im Ergebnisfenster auftaucht, dann $.Tarife usw. - und wenn Du Dir die Ergebnisse erklären kannst ist gut, wenn nicht, dann sag Bescheid.
Um das mit der Doku zu erklären. Das $ steht für das aktuelle Objekt - am Anfang als für alles:
Hier den Auszug aus der Doku:
Dann probierst Du Tarife, also
$.Tarife
Du siehst also als Ergebnis das Array - im Ausgangsobjekt Anfang und Ende gelb markiert.
Nun kommt der Stern - sprich wir wollen alle Tarife bzw. Objekte haben, egal wie sie heißen:
$.Tarife.*
Mit dem Stern hast Du eine Art Wildcard oder Joker - als Platzhalter.