Array auslesen mit JsonMod

Begonnen von Heiner33, 30 Mai 2025, 13:40:31

Vorheriges Thema - Nächstes Thema

Heiner33

Hallo zusammen,
ich kämpfe damit, mit dem JsonMod und multi() ein Array in einem Json auszulesen und Readings dafür anzulegen.

Hier das Json Dokument:
{
   "dal":{
      "sub1":{
         "sub2":{
            "loading":false,
            "loaded":true,
            "data":{
               "precipChance":[
                  0,
                  0,
                  0,
                  0,
                  0,
                  0,
                  1,
                  1,
                  3,
                  4,
                  5,
                  5,
                  5,
                  6,
                  6,
                  7,
                  6,
                  7,
                  5,
                  3,
                  2,
                  1,
                  1,
                  1
               ],
               "responseHeaders":{
                  "date":"Fri, 30 May 2025 10:58:57 GMT"
               }
            },
            "status":200,
            "statusText":"OK"
         }
      }
   }
}

Hier meine readingList

multi(jsonPath('$.dal.sub1.sub2.data.precipChance[*]'), concat('precipChance_',count(),'_hour'), property('$'));
Es werden 24 Readings angelegt, aber ich bekomme einfach keine Werte darin angezeigt.

Könnt ihr mir bitte auf die Sprünge helfen? Ich weiß einfach nicht, wie ich mit der Property-Funktion umgehen muss.

Alternativ könnte ich mich auch damit anfreunden, die ganzen Elemente des Arrays in einem einzelnen Reading kommagetrennt unterzubringen, wäre auch ok, aber auch da keine Ahnung, wie ich das hinbekomme.

Danke

betateilchen

#1
Das ist ein bekannter Mangel von JsonMod. multi() kann (noch) nicht direkt auf einen Wert im array zugreifen, wenn es keinen key dazu gibt.

Du kannst die 24 readings mit ihren Werten aber über complete() erzeugen, allerdings hast Du dann keinen direkten Einfluss auf die Namensgebung der readings und es werden eben auch readings erzeugt, die Du vielleicht gar nicht brauchst. In Deinem Beispiel sind das nur 5 zusätzliche readings, das sollte also kein Problem sein.

defmod jt JsonMod file:///tmp/test.json
attr jt readingList complete()

setstate jt 2025-05-31 12:18:28 .computedReadings dal.sub1.sub2.data.precipChance.17,dal.sub1.sub2.data.precipChance.14,dal.sub1.sub2.data.precipChance.3,dal.sub1.sub2.data.precipChance.11,dal.sub1.sub2.loading,dal.sub1.sub2.data.precipChance.22,dal.sub1.sub2.data.precipChance.2,dal.sub1.sub2.data.precipChance.21,dal.sub1.sub2.data.precipChance.0,dal.sub1.sub2.status,dal.sub1.sub2.data.precipChance.19,dal.sub1.sub2.data.precipChance.5,dal.sub1.sub2.loaded,dal.sub1.sub2.data.precipChance.4,dal.sub1.sub2.data.precipChance.1,dal.sub1.sub2.data.responseHeaders.date,dal.sub1.sub2.data.precipChance.16,dal.sub1.sub2.data.precipChance.12,dal.sub1.sub2.data.precipChance.13,dal.sub1.sub2.data.precipChance.10,dal.sub1.sub2.data.precipChance.18,dal.sub1.sub2.data.precipChance.9,dal.sub1.sub2.data.precipChance.15,dal.sub1.sub2.data.precipChance.20,dal.sub1.sub2.data.precipChance.8,dal.sub1.sub2.statusText,dal.sub1.sub2.data.precipChance.7,dal.sub1.sub2.data.precipChance.23,dal.sub1.sub2.data.precipChance.6
setstate jt 2025-05-31 12:18:28 dal.sub1.sub2.data.precipChance.0 0
setstate jt 2025-05-31 12:18:28 dal.sub1.sub2.data.precipChance.1 0
setstate jt 2025-05-31 12:18:28 dal.sub1.sub2.data.precipChance.10 5
setstate jt 2025-05-31 12:18:28 dal.sub1.sub2.data.precipChance.11 5
setstate jt 2025-05-31 12:18:28 dal.sub1.sub2.data.precipChance.12 5
setstate jt 2025-05-31 12:18:28 dal.sub1.sub2.data.precipChance.13 6
setstate jt 2025-05-31 12:18:28 dal.sub1.sub2.data.precipChance.14 6
setstate jt 2025-05-31 12:18:28 dal.sub1.sub2.data.precipChance.15 7
setstate jt 2025-05-31 12:18:28 dal.sub1.sub2.data.precipChance.16 6
setstate jt 2025-05-31 12:18:28 dal.sub1.sub2.data.precipChance.17 7
setstate jt 2025-05-31 12:18:28 dal.sub1.sub2.data.precipChance.18 5
setstate jt 2025-05-31 12:18:28 dal.sub1.sub2.data.precipChance.19 3
setstate jt 2025-05-31 12:18:28 dal.sub1.sub2.data.precipChance.2 0
setstate jt 2025-05-31 12:18:28 dal.sub1.sub2.data.precipChance.20 2
setstate jt 2025-05-31 12:18:28 dal.sub1.sub2.data.precipChance.21 1
setstate jt 2025-05-31 12:18:28 dal.sub1.sub2.data.precipChance.22 1
setstate jt 2025-05-31 12:18:28 dal.sub1.sub2.data.precipChance.23 1
setstate jt 2025-05-31 12:18:28 dal.sub1.sub2.data.precipChance.3 0
setstate jt 2025-05-31 12:18:28 dal.sub1.sub2.data.precipChance.4 0
setstate jt 2025-05-31 12:18:28 dal.sub1.sub2.data.precipChance.5 0
setstate jt 2025-05-31 12:18:28 dal.sub1.sub2.data.precipChance.6 1
setstate jt 2025-05-31 12:18:28 dal.sub1.sub2.data.precipChance.7 1
setstate jt 2025-05-31 12:18:28 dal.sub1.sub2.data.precipChance.8 3
setstate jt 2025-05-31 12:18:28 dal.sub1.sub2.data.precipChance.9 4
setstate jt 2025-05-31 12:18:28 dal.sub1.sub2.data.responseHeaders.date Fri, 30 May 2025 10:58:57 GMT
setstate jt 2025-05-31 12:18:28 dal.sub1.sub2.loaded 1
setstate jt 2025-05-31 12:18:28 dal.sub1.sub2.loading 0
setstate jt 2025-05-31 12:18:28 dal.sub1.sub2.status 200
setstate jt 2025-05-31 12:18:28 dal.sub1.sub2.statusText OK




Alternativ kannst Du mit 24 single() statements arbeiten, dann kannst Du auch den readingName angeben:

single(jsonPath('$.dal.sub1.sub2.data.precipChance.8'),'r8',-1)

liefert das reading:

setstate jt 2025-05-31 12:26:07 r8 3
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!