Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Entwicklung
    4. Readfile() json => Ergebnis mal Object mal ArrayBuffer

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    Readfile() json => Ergebnis mal Object mal ArrayBuffer

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

      Ich versuche mich gerade ein wenig an der Adapter Entwicklung und spiele in einer Umgebung mit socketio / conn.js…

      Ich verwende readFile() auf json Dateien. Üblicherweise bekomme ich ein Object zurück welches die JSON Daten enthält.

      z.B. mit diesem File funzt es:

      (liegt in iobroker-data/adpatername.0/file.json)

      userdata:{
        "projects": {
          "847777884638": {
            "project_data": {
              "id": 847777884638,
              "name": "Mein erstes Projekt"
            }
          },
          "286830724491": {
            "project_data": {
              "id": 286830724491,
              "name": "nocheins"
            }
          }
        }
      }
      

      und mit diesen File bekomm ich nur ein ArrayBuffer zurück:

      (liegt in iobroker-data/adpatername/folder/folder/file.json)

      {
      	"id": "ngl_switch",
      	"state":"beta",
      	"version":"0.0.1",
      	"latest":"07.02.2018",
      	"name": {
      		"de":"Schalter",
      		"en":"Switch",
      		"ru":"Switch"
      	},
      	"desc": {
      		"de":"Einfaches Schalter Widget mit Optionen",
      		"en":"Simple switch widget with options",
      		"ru":"Simple switch widget with options"
      	}
      }
      

      Meines erachtes sind beide Files valide. Liegt es am Ort wo die JSON Files gespeichert sind?

      Hat jemand eine Idee oder einen Ansatz 🙂 ?

      Danke!

      1 Reply Last reply Reply Quote 0
      • apollon77
        apollon77 last edited by

        Ließ mal https://nodejs.org/api/fs.html

        Das liegt daran das du (Annahme weil hast leider deinen Code nicht gepostet) kein encoding setzt.

        Ob du dann ein String oder ein arraybuffer bekommst hängt davon ab wie das encoding der Datei ist.

        Wenn du auch ein encoding angibst sollte es immer ein String sein.

        Gesendet vom Handy …

        1 Reply Last reply Reply Quote 0
        • snador
          snador last edited by

          Ich nutze die connection class aus der conn.js des socket.io Adapters. Dort sieht die Funktion wie folge aus:

          readFile:         function (filename, callback, isRemote) {
                  if (!callback) throw 'No callback set';
          
                  if (this._type === 'local') {
                      try {
                          var data = storage.get(filename);
                          callback(null, data ? JSON.parse(storage.get(filename)) : null);
                      } catch (err) {
                          callback(err, null);
                      }
                  } else {
                      if (!this._checkConnection('readFile', arguments)) return;
          
                      if (!isRemote && typeof app !== 'undefined' && !app.settings.dontCache) {
                          app.readLocalFile(filename.replace(/^\/vis\.0\//, ''), callback);
                      } else {
                          var adapter = this.namespace;
                          if (filename[0] === '/') {
                              var p = filename.split('/');
                              adapter = p[1];
                              p.splice(0, 2);
                              filename = p.join('/');
                          }
          
                          this._socket.emit('readFile', adapter, filename, function (err, data, mimeType) {
                              setTimeout(function () {
                                  callback(err, data, filename, mimeType);
                              }, 0);
                          });
                      }
                  }
              },
          

          Dort scheint es keinen Option bzgl. der Angabe der Codierung zu geben.

          1 Reply Last reply Reply Quote 0
          • apollon77
            apollon77 last edited by

            Dann musst Du ggf den ArrayBuffer in String umwandeln indem Du da das Encoding nutzt

            1 Reply Last reply Reply Quote 0
            • snador
              snador last edited by

              Mich wundert nur, dass es mit einem File geht und mit einem anderen nicht 🙂 Ich werd nicht so ganz schlau daraus…

              1 Reply Last reply Reply Quote 0
              • snador
                snador last edited by

                Zudem werd ich aus den Infos aus dem Web nicht ganz schlau. 😞 In dem ArrayBuffer des JSON Files liegen ja unterschiedlich Arrays drin. (siehe Screen) Welches nehme ich und wie kann ich es sinnvoll dekodieren.
                4236_arraybuffer.jpg

                1 Reply Last reply Reply Quote 0
                • apollon77
                  apollon77 last edited by

                  Google is your friend :-))

                  https://github.com/inexorabletash/text-encoding

                  keine Ahnung hab ich auch noch nie gemacht 🙂

                  1 Reply Last reply Reply Quote 0
                  • snador
                    snador last edited by

                    Danke für Deine Hilfe. Zur Vollständigkeit 🙂 - Statt eine Lösung für unzählige Encodings einzubinden behelfe ich mir mit einer kleinen Funktion die UTF8Arrays konvertiert.

                    convertUtf8ArrayToStr:function(array) {
                            var out, i, len, c;
                            var char2, char3;
                    
                            out = "";
                            len = array.length;
                            i = 0;
                            while(i < len) {
                            c = array[i++];
                            switch(c >> 4)
                            { 
                              case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7:
                                // 0xxxxxxx
                                out += String.fromCharCode(c);
                                break;
                              case 12: case 13:
                                // 110x xxxx   10xx xxxx
                                char2 = array[i++];
                                out += String.fromCharCode(((c & 0x1F) << 6) | (char2 & 0x3F));
                                break;
                              case 14:
                                // 1110 xxxx  10xx xxxx  10xx xxxx
                                char2 = array[i++];
                                char3 = array[i++];
                                out += String.fromCharCode(((c & 0x0F) << 12) |
                                               ((char2 & 0x3F) << 6) |
                                               ((char3 & 0x3F) << 0));
                                break;
                            }
                            }
                    
                            return out;
                        }
                    

                    Da ich noch keine richtige Lösung gefunden habe wie ich sicher checke ob der Return Value ein ArrayBuffer ist statt eines Strings behelfe ich mir im Moment damit zu Checken ob der Return Value ein Object ist und hole dann das Uint8Array aus dem Buffer. Dann check ich ob der Typ wieder ein Object ist und wandle dann um in einen String.

                    if(typeof theData == 'object'){
                        var uint8Array = new Uint8Array(theData);
                        if(typeof uint8Array == 'object'){
                            theData = ngl.convertUtf8ArrayToStr(uint8Array);
                        }
                    }
                    

                    Sollte es dafür eine bessere / plausiblere Lösung geben bin ich für Tips dankbar.

                    LG

                    1 Reply Last reply Reply Quote 0
                    • AlCalzone
                      AlCalzone Developer last edited by

                      @snador:

                      Da ich noch keine richtige Lösung gefunden habe wie ich sicher checke ob der Return Value ein ArrayBuffer ist statt eines Strings behelfe ich mir im Moment damit zu Checken ob der Return Value ein Object ist und hole dann das Uint8Array aus dem Buffer. Dann check ich ob der Typ wieder ein Object ist und wandle dann um in einen String.

                      Sollte es dafür eine bessere / plausiblere Lösung geben bin ich für Tips dankbar. `

                      Wie wäre es mit

                      if (theData instanceof Uint8Array) { // bzw instanceof ArrayBuffer
                        // ...
                      }
                      
                      1 Reply Last reply Reply Quote 0
                      • snador
                        snador last edited by

                        Das ergibt bei mir false 🙂 Wenn ich anhand meines Codes oben

                        if(uint8Array instanceof Uint8Array)
                        

                        checke dann natürlich true. Das kann ich auch mit

                        if(ArrayBuffer.isView(uint8Array))
                        

                        machen. So mache ich es mitterweile. Allerdings habe ich bei beiden Varianten das View schon aus dem ArrayBuffer geholt.

                        Mir war eher dran gelegen ob ich einfach prüfen kann ob der Return ein ArrayBuffer ist.

                        LG

                        1 Reply Last reply Reply Quote 0
                        • snador
                          snador last edited by

                          Sorry theData instanceof ArrayBuffer funzt natürlich… Danke!

                          1 Reply Last reply Reply Quote 0
                          • First post
                            Last post

                          Support us

                          ioBroker
                          Community Adapters
                          Donate

                          465
                          Online

                          31.7k
                          Users

                          79.8k
                          Topics

                          1.3m
                          Posts

                          3
                          11
                          832
                          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