Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Entwicklung
  4. Probleme beim parsen von Arrays mit json2iob

NEWS

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    8.7k

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    13
    1
    2.2k

  • Neues Video "KI im Smart Home" - ioBroker plus n8n
    BluefoxB
    Bluefox
    16
    1
    3.1k

Probleme beim parsen von Arrays mit json2iob

Geplant Angeheftet Gesperrt Verschoben Entwicklung
json2iobjsonparser
6 Beiträge 4 Kommentatoren 482 Aufrufe 2 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • HobbitH Offline
    HobbitH Offline
    Hobbit
    schrieb am zuletzt editiert von
    #1

    Hi,

    ich bin gerade etwas verzweifelt beim parsen von json arrays. In den Arrays stehen zu allem Überfluss auch noch IP Adressen.

    Es wird versucht die Inhalte vom Array als objectname anzulegen. Durch die Dots kommt dann natürlich nur Mist heraus.

     await this.json2iob.parse('test' + id, item, { forceIndex: true, zeroBasedArrayIndex : true });
    

    59af95bc-776e-4a77-bf4d-654d8954bfa6-image.png

    Erwartet hätte ich es jetzt so, mit dem Index als Namen. Ich bin es erstmal umgangen mit einer eigenen kleinen Funktion, finde ich aber nicht so schön. Eigentlich würde ich gern auf bestehende Funktionen zurückgreifen.

     await this.json2iob_lite(item, id);
    

    5a99e205-5d87-40cc-8eae-7d2fb187d5b4-image.png

    Der Payload sieht wie folgt aus.

    {
        "addresses": ["100.24.237.45", "fd7a:115c:f34e::b347:019a"],
        "id": "607993024204548320",
        "nodeId": "m3er3kYT4sg1CNTRL",
        "user": "cvoelkel76@gmail.com",
        "name": "samsung-christian.tail43a1b.ts.net",
        "hostname": "samsung SM-G980F",
        "clientVersion": "1.76.6-t1edcf9d46-g",
        "updateAvailable": false,
        "os": "android",
        "created": "2024-03-01T09:00:25Z",
        "lastSeen": "2024-12-18T12:41:20Z",
        "keyExpiryDisabled": false,
        "expires": "2025-05-03T18:21:30Z",
        "authorized": true,
        "isExternal": false,
        "machineKey": "mkey:e209f6782e650527e913e36fcc74",
        "nodeKey": "nodekey:643019f7b347ed1d",
        "tailnetLockKey": "nlpub:9f28c4e7c1f66da3b",
        "blocksIncomingConnections": false,
        "enabledRoutes": [],
        "advertisedRoutes": [],
        "clientConnectivity": {
            "endpoints": ["91.56.179.29:48133", "192.168.20.28:48133", "[a8b0:59f:9ab6:5b2b:2091:f593:bdae:308]:48133"],
            "mappingVariesByDestIP": false,
            "latency": {},
            "clientSupports": {
                "hairPinning": null,
                "ipv6": false,
                "pcp": false,
                "pmp": false,
                "udp": true,
                "upnp": false
            }
        }
    }
    

    Tjo, keine Ahnung. Habe bei dem json2iob Parser einige Sachen probiert, es kommt aber immer das gleiche heraus. Hat irgendwer einen Tipp? Ich könnte noch versuchen den Payload anzupassen, bevor ich ihn in den Parser schicke . . . ist aber auch eher unschön.

    ioBroker auf Proxmox ThinkCenter M910q / RaspberryMatic / Homematic IP / Omada SDN

    mickymM T 2 Antworten Letzte Antwort
    0
    • HobbitH Hobbit

      Hi,

      ich bin gerade etwas verzweifelt beim parsen von json arrays. In den Arrays stehen zu allem Überfluss auch noch IP Adressen.

      Es wird versucht die Inhalte vom Array als objectname anzulegen. Durch die Dots kommt dann natürlich nur Mist heraus.

       await this.json2iob.parse('test' + id, item, { forceIndex: true, zeroBasedArrayIndex : true });
      

      59af95bc-776e-4a77-bf4d-654d8954bfa6-image.png

      Erwartet hätte ich es jetzt so, mit dem Index als Namen. Ich bin es erstmal umgangen mit einer eigenen kleinen Funktion, finde ich aber nicht so schön. Eigentlich würde ich gern auf bestehende Funktionen zurückgreifen.

       await this.json2iob_lite(item, id);
      

      5a99e205-5d87-40cc-8eae-7d2fb187d5b4-image.png

      Der Payload sieht wie folgt aus.

      {
          "addresses": ["100.24.237.45", "fd7a:115c:f34e::b347:019a"],
          "id": "607993024204548320",
          "nodeId": "m3er3kYT4sg1CNTRL",
          "user": "cvoelkel76@gmail.com",
          "name": "samsung-christian.tail43a1b.ts.net",
          "hostname": "samsung SM-G980F",
          "clientVersion": "1.76.6-t1edcf9d46-g",
          "updateAvailable": false,
          "os": "android",
          "created": "2024-03-01T09:00:25Z",
          "lastSeen": "2024-12-18T12:41:20Z",
          "keyExpiryDisabled": false,
          "expires": "2025-05-03T18:21:30Z",
          "authorized": true,
          "isExternal": false,
          "machineKey": "mkey:e209f6782e650527e913e36fcc74",
          "nodeKey": "nodekey:643019f7b347ed1d",
          "tailnetLockKey": "nlpub:9f28c4e7c1f66da3b",
          "blocksIncomingConnections": false,
          "enabledRoutes": [],
          "advertisedRoutes": [],
          "clientConnectivity": {
              "endpoints": ["91.56.179.29:48133", "192.168.20.28:48133", "[a8b0:59f:9ab6:5b2b:2091:f593:bdae:308]:48133"],
              "mappingVariesByDestIP": false,
              "latency": {},
              "clientSupports": {
                  "hairPinning": null,
                  "ipv6": false,
                  "pcp": false,
                  "pmp": false,
                  "udp": true,
                  "upnp": false
              }
          }
      }
      

      Tjo, keine Ahnung. Habe bei dem json2iob Parser einige Sachen probiert, es kommt aber immer das gleiche heraus. Hat irgendwer einen Tipp? Ich könnte noch versuchen den Payload anzupassen, bevor ich ihn in den Parser schicke . . . ist aber auch eher unschön.

      mickymM Online
      mickymM Online
      mickym
      Most Active
      schrieb am zuletzt editiert von mickym
      #2

      gelöscht

      Jeder Flow bzw. jedes Script, das ich hier poste implementiert jeder auf eigene Gefahr. Flows und Scripts können Fehler aufweisen und weder der Seitenbetreiber noch ich persönlich können hierfür haftbar gemacht werden. Das gleiche gilt für Empfehlungen aller Art.

      1 Antwort Letzte Antwort
      0
      • HobbitH Hobbit

        Hi,

        ich bin gerade etwas verzweifelt beim parsen von json arrays. In den Arrays stehen zu allem Überfluss auch noch IP Adressen.

        Es wird versucht die Inhalte vom Array als objectname anzulegen. Durch die Dots kommt dann natürlich nur Mist heraus.

         await this.json2iob.parse('test' + id, item, { forceIndex: true, zeroBasedArrayIndex : true });
        

        59af95bc-776e-4a77-bf4d-654d8954bfa6-image.png

        Erwartet hätte ich es jetzt so, mit dem Index als Namen. Ich bin es erstmal umgangen mit einer eigenen kleinen Funktion, finde ich aber nicht so schön. Eigentlich würde ich gern auf bestehende Funktionen zurückgreifen.

         await this.json2iob_lite(item, id);
        

        5a99e205-5d87-40cc-8eae-7d2fb187d5b4-image.png

        Der Payload sieht wie folgt aus.

        {
            "addresses": ["100.24.237.45", "fd7a:115c:f34e::b347:019a"],
            "id": "607993024204548320",
            "nodeId": "m3er3kYT4sg1CNTRL",
            "user": "cvoelkel76@gmail.com",
            "name": "samsung-christian.tail43a1b.ts.net",
            "hostname": "samsung SM-G980F",
            "clientVersion": "1.76.6-t1edcf9d46-g",
            "updateAvailable": false,
            "os": "android",
            "created": "2024-03-01T09:00:25Z",
            "lastSeen": "2024-12-18T12:41:20Z",
            "keyExpiryDisabled": false,
            "expires": "2025-05-03T18:21:30Z",
            "authorized": true,
            "isExternal": false,
            "machineKey": "mkey:e209f6782e650527e913e36fcc74",
            "nodeKey": "nodekey:643019f7b347ed1d",
            "tailnetLockKey": "nlpub:9f28c4e7c1f66da3b",
            "blocksIncomingConnections": false,
            "enabledRoutes": [],
            "advertisedRoutes": [],
            "clientConnectivity": {
                "endpoints": ["91.56.179.29:48133", "192.168.20.28:48133", "[a8b0:59f:9ab6:5b2b:2091:f593:bdae:308]:48133"],
                "mappingVariesByDestIP": false,
                "latency": {},
                "clientSupports": {
                    "hairPinning": null,
                    "ipv6": false,
                    "pcp": false,
                    "pmp": false,
                    "udp": true,
                    "upnp": false
                }
            }
        }
        

        Tjo, keine Ahnung. Habe bei dem json2iob Parser einige Sachen probiert, es kommt aber immer das gleiche heraus. Hat irgendwer einen Tipp? Ich könnte noch versuchen den Payload anzupassen, bevor ich ihn in den Parser schicke . . . ist aber auch eher unschön.

        T Nicht stören
        T Nicht stören
        ticaki
        schrieb am zuletzt editiert von ticaki
        #3

        @hobbit

        Ich verstehe nicht ganz was du willst.

        Ein String in ein Json umwandeln geht mit:

        const myjson = JSON.parse(jsonString)
        

        zugriff auf einen Datenpunkt gibts mit:

        const key = myjson. tailnetLockKey;
        

        Zugriff auf das array:

        const arr = myjson.clientConnectivit.endpoints;
        for (const item of arr) {
          log(item)
        }
        

        über das ganze object rennst du mit:

        function _findData(data) {
                    if (typeof data === 'object') {
                        if (Array.isArray(data)) {
                            data.forEach(item => _findData(item));
                        } else {
                            Object.keys(data).forEach(key => _findData(data[key]);
                        }
                    } else {
                       log(data)
                    }
        }
        

        Da muß man jetzt noch den key zusammenbauen und übergeben damit man weiß woher die Daten kommen dat wird aber bissle unübersichtlich.

        EDIT: hab in einem Skript ein Beispiel gefunden:

        async function setKeys(id, result) {
                if (result === null) return
                if (typeof(result) === 'object') {
                    if (result.isArray) {
                        for (let a = 0; a<result.length; a++) {
                            setKeys(id+'.'+a, result[a])
                        }
                    } else {
                        for (let key in result) {
                            setKeys(id+'.'+key, result[key])
                        }
                    }
                } else {
                    if (existsState(id)) {
                        setState(id, result, true)
                    } else {
                        // erzeuge State
        

        Weather-Warnings Espresense NSPanel-Lovelace-ui Tagesschau

        Spenden

        HobbitH 1 Antwort Letzte Antwort
        0
        • T ticaki

          @hobbit

          Ich verstehe nicht ganz was du willst.

          Ein String in ein Json umwandeln geht mit:

          const myjson = JSON.parse(jsonString)
          

          zugriff auf einen Datenpunkt gibts mit:

          const key = myjson. tailnetLockKey;
          

          Zugriff auf das array:

          const arr = myjson.clientConnectivit.endpoints;
          for (const item of arr) {
            log(item)
          }
          

          über das ganze object rennst du mit:

          function _findData(data) {
                      if (typeof data === 'object') {
                          if (Array.isArray(data)) {
                              data.forEach(item => _findData(item));
                          } else {
                              Object.keys(data).forEach(key => _findData(data[key]);
                          }
                      } else {
                         log(data)
                      }
          }
          

          Da muß man jetzt noch den key zusammenbauen und übergeben damit man weiß woher die Daten kommen dat wird aber bissle unübersichtlich.

          EDIT: hab in einem Skript ein Beispiel gefunden:

          async function setKeys(id, result) {
                  if (result === null) return
                  if (typeof(result) === 'object') {
                      if (result.isArray) {
                          for (let a = 0; a<result.length; a++) {
                              setKeys(id+'.'+a, result[a])
                          }
                      } else {
                          for (let key in result) {
                              setKeys(id+'.'+key, result[key])
                          }
                      }
                  } else {
                      if (existsState(id)) {
                          setState(id, result, true)
                      } else {
                          // erzeuge State
          
          HobbitH Offline
          HobbitH Offline
          Hobbit
          schrieb am zuletzt editiert von
          #4

          @ticaki ja, die Infos waren ggf. etwas spärlich :D

          Ich versuche gerade einen Adapter zu machen und lese eine API aus. Das erhaltene JSON soll dann im Adapter als Datenpunkte angelegt werden. Klar kann man alles selber schreiben. Es gibt aber wunderschöne Module wie TA2k/json2iob.

          Hier habe ich das oben beschriebe Problem, das die Elemente als Namen genutzt werden. Das ist ja bei den meisten vielleicht auch kein Problem, allerdings bei IP Adressen erstellt er eben nicht einen Datenpunkt sondern Ordner mit den einzelnen IP Segmenten.

          Ich dachte erst ich bin zu blöde, glaube aber das ist ein kleiner Fehler im json2iob. Habe mir mal den Code angeschaut einen Pull Request geschickt. Denke wenn alles passt sollte es in der nächsten Version richtig angelegt werden und ich erspare mir eine Menge eigenen Code.

          ioBroker auf Proxmox ThinkCenter M910q / RaspberryMatic / Homematic IP / Omada SDN

          T mcm1957M 2 Antworten Letzte Antwort
          0
          • HobbitH Hobbit

            @ticaki ja, die Infos waren ggf. etwas spärlich :D

            Ich versuche gerade einen Adapter zu machen und lese eine API aus. Das erhaltene JSON soll dann im Adapter als Datenpunkte angelegt werden. Klar kann man alles selber schreiben. Es gibt aber wunderschöne Module wie TA2k/json2iob.

            Hier habe ich das oben beschriebe Problem, das die Elemente als Namen genutzt werden. Das ist ja bei den meisten vielleicht auch kein Problem, allerdings bei IP Adressen erstellt er eben nicht einen Datenpunkt sondern Ordner mit den einzelnen IP Segmenten.

            Ich dachte erst ich bin zu blöde, glaube aber das ist ein kleiner Fehler im json2iob. Habe mir mal den Code angeschaut einen Pull Request geschickt. Denke wenn alles passt sollte es in der nächsten Version richtig angelegt werden und ich erspare mir eine Menge eigenen Code.

            T Nicht stören
            T Nicht stören
            ticaki
            schrieb am zuletzt editiert von
            #5

            @hobbit

            ok ich hab mir den code einmal für mich geschrieben und benutze den einfach immer wieder.

            Weather-Warnings Espresense NSPanel-Lovelace-ui Tagesschau

            Spenden

            1 Antwort Letzte Antwort
            0
            • HobbitH Hobbit

              @ticaki ja, die Infos waren ggf. etwas spärlich :D

              Ich versuche gerade einen Adapter zu machen und lese eine API aus. Das erhaltene JSON soll dann im Adapter als Datenpunkte angelegt werden. Klar kann man alles selber schreiben. Es gibt aber wunderschöne Module wie TA2k/json2iob.

              Hier habe ich das oben beschriebe Problem, das die Elemente als Namen genutzt werden. Das ist ja bei den meisten vielleicht auch kein Problem, allerdings bei IP Adressen erstellt er eben nicht einen Datenpunkt sondern Ordner mit den einzelnen IP Segmenten.

              Ich dachte erst ich bin zu blöde, glaube aber das ist ein kleiner Fehler im json2iob. Habe mir mal den Code angeschaut einen Pull Request geschickt. Denke wenn alles passt sollte es in der nächsten Version richtig angelegt werden und ich erspare mir eine Menge eigenen Code.

              mcm1957M Online
              mcm1957M Online
              mcm1957
              schrieb am zuletzt editiert von
              #6

              @hobbit

              Sei dir bitte bewußt dass json2iob KEIN vom Coreteam bereitgestellter Modul ist und daher prinzipiell jederzeit inkompatibel werden könnte (ich schreibe bewußt könnte, mir sind derzeit außer deinem Problem keine Fehler bekannt). Das Core-Team hat auf solche Privatmodule jedenfalls keinen Zugriff und kann daher auch im Notfall keinen Override setzen falls mal was inkompatibel wird und den Modul im allgemeinen auch nicht übernehmen falls der Maintainer nicht mehr aktiv ist.

              Wenn du das json von extern bekommst musst du aber jedenfalls sicherstellen, dass

              • die StateIds keine unzulässigen Zeichen enthalten. Keine Ahnung ob das in json2iob schon drinnen ist - wenn nicht musst du gegen adapter.FORBIDDEN_CHARS prüfen und diese Zeichen ersetzen.
              • jedenfalls die Roles der States geeignet setzen - diese werden kaum von einer externen Quelle richtig geliefert werden.

              Entwicklung u Betreuung: envertech-pv, hoymiles-ms, ns-client, pid, snmp Adapter;
              Support Repositoryverwaltung.

              Wer Danke sagen will, kann nen Kaffee spendieren: https://paypal.me/mcm1957atiobroker

              LESEN - gute Forenbeitrage

              1 Antwort Letzte Antwort
              1
              Antworten
              • In einem neuen Thema antworten
              Anmelden zum Antworten
              • Älteste zuerst
              • Neuste zuerst
              • Meiste Stimmen


              Support us

              ioBroker
              Community Adapters
              Donate

              756

              Online

              32.4k

              Benutzer

              81.5k

              Themen

              1.3m

              Beiträge
              Community
              Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
              ioBroker Community 2014-2025
              logo
              • Anmelden

              • Du hast noch kein Konto? Registrieren

              • Anmelden oder registrieren, um zu suchen
              • Erster Beitrag
                Letzter Beitrag
              0
              • Home
              • Aktuell
              • Tags
              • Ungelesen 0
              • Kategorien
              • Unreplied
              • Beliebt
              • GitHub
              • Docu
              • Hilfe