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. Readfile() json => Ergebnis mal Object mal ArrayBuffer

NEWS

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    22
    1
    1.1k

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

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    14
    1
    2.4k

Readfile() json => Ergebnis mal Object mal ArrayBuffer

Geplant Angeheftet Gesperrt Verschoben Entwicklung
11 Beiträge 3 Kommentatoren 916 Aufrufe
  • Ä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.
  • snadorS Offline
    snadorS Offline
    snador
    schrieb am zuletzt editiert von
    #1

    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 Antwort Letzte Antwort
    0
    • apollon77A Offline
      apollon77A Offline
      apollon77
      schrieb am zuletzt editiert von
      #2

      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 …

      Beitrag hat geholfen? Votet rechts unten im Beitrag :-) https://paypal.me/Apollon77 / https://github.com/sponsors/Apollon77

      • Debug-Log für Instanz einschalten? Admin -> Instanzen -> Expertenmodus -> Instanz aufklappen - Loglevel ändern
      • Logfiles auf Platte /opt/iobroker/log/… nutzen, Admin schneidet Zeilen ab
      1 Antwort Letzte Antwort
      0
      • snadorS Offline
        snadorS Offline
        snador
        schrieb am zuletzt editiert von
        #3

        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 Antwort Letzte Antwort
        0
        • apollon77A Offline
          apollon77A Offline
          apollon77
          schrieb am zuletzt editiert von
          #4

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

          Beitrag hat geholfen? Votet rechts unten im Beitrag :-) https://paypal.me/Apollon77 / https://github.com/sponsors/Apollon77

          • Debug-Log für Instanz einschalten? Admin -> Instanzen -> Expertenmodus -> Instanz aufklappen - Loglevel ändern
          • Logfiles auf Platte /opt/iobroker/log/… nutzen, Admin schneidet Zeilen ab
          1 Antwort Letzte Antwort
          0
          • snadorS Offline
            snadorS Offline
            snador
            schrieb am zuletzt editiert von
            #5

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

            1 Antwort Letzte Antwort
            0
            • snadorS Offline
              snadorS Offline
              snador
              schrieb am zuletzt editiert von
              #6

              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 Antwort Letzte Antwort
              0
              • apollon77A Offline
                apollon77A Offline
                apollon77
                schrieb am zuletzt editiert von
                #7

                Google is your friend :-))

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

                keine Ahnung hab ich auch noch nie gemacht :-)

                Beitrag hat geholfen? Votet rechts unten im Beitrag :-) https://paypal.me/Apollon77 / https://github.com/sponsors/Apollon77

                • Debug-Log für Instanz einschalten? Admin -> Instanzen -> Expertenmodus -> Instanz aufklappen - Loglevel ändern
                • Logfiles auf Platte /opt/iobroker/log/… nutzen, Admin schneidet Zeilen ab
                1 Antwort Letzte Antwort
                0
                • snadorS Offline
                  snadorS Offline
                  snador
                  schrieb am zuletzt editiert von
                  #8

                  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 Antwort Letzte Antwort
                  0
                  • AlCalzoneA Offline
                    AlCalzoneA Offline
                    AlCalzone
                    Developer
                    schrieb am zuletzt editiert von
                    #9

                    @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
                      // ...
                    }
                    

                    Warum `sudo` böse ist: https://forum.iobroker.net/post/17109

                    1 Antwort Letzte Antwort
                    0
                    • snadorS Offline
                      snadorS Offline
                      snador
                      schrieb am zuletzt editiert von
                      #10

                      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 Antwort Letzte Antwort
                      0
                      • snadorS Offline
                        snadorS Offline
                        snador
                        schrieb am zuletzt editiert von
                        #11

                        Sorry theData instanceof ArrayBuffer funzt natürlich… Danke!

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


                        Support us

                        ioBroker
                        Community Adapters
                        Donate

                        422

                        Online

                        32.5k

                        Benutzer

                        81.7k

                        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