jason Transformation

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
dobby
Beiträge: 23
Registriert: 29. Jan 2022 19:53
Answers: 0

jason Transformation

Beitrag von dobby »

[Hallo!
Ich versuche einen JsonPath auszulesen. Ich bekomme die Daten zwar rein, kann aber einen bestimmten Wert nicht auslesen. Der Jsonstring (formatiert) sieht wie folgt aus:

Code: Alles auswählen

{
   "status":{
      "code":200
   },
   "payload":{
      "stations":[
         {
            "name":"Krems / Kremsmünster / at",
            "commonid":"205641-at",
            "country":"Österreich",
            "stationName":"Kremsmünster",
            "water":"Krems",
            "region":"Oberösterreich",
            "latitude":48.051569047905,
            "longitude":14.132392872745,
            "positionKm":35.35,
            "altitudeM":345.0,
            "defaultWarnValueCm":245.0,
            "defaultWarnValueM3s":50.0,
            "defaultAlarmValueCm":280.0,
            "defaultAlarmValueM3s":68.0,
            "data":[
               {
                  "type":"height in cm",
                  "value":84.0,
                  "requestDate":"09.03.2023T09:08:33+0100",
                  "sourceDate":"09.03.2023T09:00:00+0100"
               },
               {
                  "type":"flow in m3s",
                  "value":2.81,
                  "requestDate":"09.03.2023T09:00:07+0100",
                  "sourceDate":"09.03.2023T08:30:00+0100"
               }
            ],
            "trend":-10,
            "situation":10,
            "visibility":"PUBLIC",
            "stationType":"surfacewater",
            "style":{
               "color":"green",
               "state":"falling"
            }
         }
      ]
   }
}
Hat jemand eine Idee wie die State Transformation richtig ist? Ich möchte bei data den Wert Value auslesen.

Danke bereits im Voraus

Sebastian

Benutzeravatar
udo1toni
Beiträge: 15247
Registriert: 11. Apr 2018 18:05
Answers: 242
Wohnort: Darmstadt

Re: jason Transformation

Beitrag von udo1toni »

Da hast Du ein (lösbares) Problem, denn es gibt zwei Werte namens value unterhalb von data.
"einfach" wäre dieser JSONPATH für den ersten Wert korrekt:

Code: Alles auswählen

$.payload.stations[0].data[0].value
und entsprechend für den zweiten Wert

Code: Alles auswählen

$.payload.stations[0].data[1].value
Allerdings setzt das ein paar Dinge voraus, zum Einen, dass tatsächlich immer nur eine Station enthalten ist (das ist evtl. tatsächlich der Fall), zum Anderen, dass beide Werte immer in der Reihenfolge Höhe - Flussgeschwindigkeit kommen. Grundsätzlich gibt es dafür aber keine Garantie, wenn JSON konsequent verwendet wird, kann die Reihenfolge variieren.
Deshalb ist es dann besser, ein eindeutiges Merkmal zu nutzen, in diesem Fall der Text im Feld type. Das sieht dann so aus:

Code: Alles auswählen

$.payload.stations[0].data[?(@.type=='height in cm')].value
wird aus dem gezeigten JSON Objekt den Wert 84.0 liefern,

Code: Alles auswählen

$.payload.stations[0].data[?(@.type=='flow in m3s')].value
hingegen den Wert 2.81. In dieser Form ist es egal, in welcher Reihenfolge die Werte gelistet sind.
Das Gleiche kann man auch für die Station machen, falls man im JSON mehrere Stationen geliefert bekommt.
Das kann vor allem interessant sein, wenn man nur eine bestimmte Anzahl Calls pro Tag hat, aber vielleicht dutzende Stationen möglichst oft abfragen will.

Das ?() ist eine Bedingung. @ ist der Knoten, so wie er an dieser Stelle aussieht. Hier wäre das also

Code: Alles auswählen

{
    "type": "height in cm",
    "value": 84.0,
    "requestDate": "09.03.2023T09:08:33+0100",
    "sourceDate": "09.03.2023T09:00:00+0100"
},
{
    "type": "flow in m3s",
    "value": 2.81,
    "requestDate": "09.03.2023T09:00:07+0100",
    "sourceDate": "09.03.2023T08:30:00+0100"
}
@.type=='height in cm' nimmt nun den Unterknoten, in dem type den Wert "height in cm" aufweist. Alle nachgeordneten Operationen beziehen sich nur noch auf diesen Knoten, weshalb .value dann auch nur noch den einen Wert liefert.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

dobby
Beiträge: 23
Registriert: 29. Jan 2022 19:53
Answers: 0

Re: jason Transformation

Beitrag von dobby »

Danke
Funktioniert perfekt und noch dazu habe ich mit Deinen Erklärungen wieder etwas dazu gelernt.

Antworten