Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Entwicklung
    4. Probleme beim parsen von Arrays mit json2iob

    NEWS

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    Probleme beim parsen von Arrays mit json2iob

    This topic has been deleted. Only users with topic management privileges can see it.
    • Hobbit
      Hobbit last edited by

      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.

      mickym T 2 Replies Last reply Reply Quote 0
      • mickym
        mickym Most Active @Hobbit last edited by mickym

        gelöscht

        1 Reply Last reply Reply Quote 0
        • T
          ticaki Developer @Hobbit last edited by 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
          
          Hobbit 1 Reply Last reply Reply Quote 0
          • Hobbit
            Hobbit @ticaki last edited by

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

            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 mcm1957 2 Replies Last reply Reply Quote 0
            • T
              ticaki Developer @Hobbit last edited by

              @hobbit

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

              1 Reply Last reply Reply Quote 0
              • mcm1957
                mcm1957 @Hobbit last edited by

                @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.
                1 Reply Last reply Reply Quote 1
                • First post
                  Last post

                Support us

                ioBroker
                Community Adapters
                Donate

                475
                Online

                31.7k
                Users

                79.8k
                Topics

                1.3m
                Posts

                json json2iob parser
                4
                6
                245
                Loading More Posts
                • Oldest to Newest
                • Newest to Oldest
                • Most Votes
                Reply
                • Reply as topic
                Log in to reply
                Community
                Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                The ioBroker Community 2014-2023
                logo