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. ioBroker Allgemein
  4. JSON interpretieren

NEWS

  • Jahresrückblick 2025 – unser neuer Blogbeitrag ist online! ✨
    BluefoxB
    Bluefox
    16
    1
    1.2k

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    13
    1
    743

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    2.0k

JSON interpretieren

Geplant Angeheftet Gesperrt Verschoben ioBroker Allgemein
17 Beiträge 4 Kommentatoren 902 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.
  • paul53P paul53

    @150d sagte: warum
    data = JSON.parse(json);
    nicht funktioniert.

    Ist das vermeintliche JSON vielleicht kein JSON, sondern bereits ein Objekt?

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

    @paul53 sagte in JSON interpretieren:

    @150d sagte: warum
    data = JSON.parse(json);
    nicht funktioniert.

    Ist das vermeintliche JSON vielleicht kein JSON, sondern bereits ein Objekt?

    Ja das kann SEIN, weil sonst würde er es oben ja nicht stringifizieren.

    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 1 Antwort Letzte Antwort
    0
    • mickymM mickym

      @paul53 sagte in JSON interpretieren:

      @150d sagte: warum
      data = JSON.parse(json);
      nicht funktioniert.

      Ist das vermeintliche JSON vielleicht kein JSON, sondern bereits ein Objekt?

      Ja das kann SEIN, weil sonst würde er es oben ja nicht stringifizieren.

      1 Offline
      1 Offline
      150d
      schrieb am zuletzt editiert von 150d
      #9

      In der Tat, das funktioniert. (Ich bin neu hier - bei JavaScript -; ich weiß noch nicht so genau, was ich tue... :-) )

      Was ich möchte:

      Der JSON-String soll rekursiv geparst werden und aus dem Inhalt ioBroker-States angelegt werden. Folgendes habe ich versucht:

      function parse_json_data(jsondata) {
      
      	for (var substr in jsondata) {
      		
      		if (typeof substr === "object") {
      			return parse_json_data(substr);
      		} else {
      			adapter.log.info("substring: " + substr);
      		}
      		
      	}
      
      }
      
      

      Das klappt aber nicht, es wird nur der eine Eintrag "overview" erkannt. Die Rekursion funktioniert nicht.

      Wie kann ich zwischen "Knoten" und "Blatt" unterscheiden?

      mickymM paul53P 2 Antworten Letzte Antwort
      0
      • 1 150d

        In der Tat, das funktioniert. (Ich bin neu hier - bei JavaScript -; ich weiß noch nicht so genau, was ich tue... :-) )

        Was ich möchte:

        Der JSON-String soll rekursiv geparst werden und aus dem Inhalt ioBroker-States angelegt werden. Folgendes habe ich versucht:

        function parse_json_data(jsondata) {
        
        	for (var substr in jsondata) {
        		
        		if (typeof substr === "object") {
        			return parse_json_data(substr);
        		} else {
        			adapter.log.info("substring: " + substr);
        		}
        		
        	}
        
        }
        
        

        Das klappt aber nicht, es wird nur der eine Eintrag "overview" erkannt. Die Rekursion funktioniert nicht.

        Wie kann ich zwischen "Knoten" und "Blatt" unterscheiden?

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

        gelöscht - du hast ja for in genutzt, aber substr ist der Key und nicht das Objekt.

        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 1 Antwort Letzte Antwort
        0
        • mickymM mickym

          gelöscht - du hast ja for in genutzt, aber substr ist der Key und nicht das Objekt.

          1 Offline
          1 Offline
          150d
          schrieb am zuletzt editiert von 150d
          #11

          (delete - checking... :-) )

          mickymM OliverIOO 2 Antworten Letzte Antwort
          0
          • 1 150d

            (delete - checking... :-) )

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

            @150d

            if (typeof jsondata[substr] === "object"){
            			return parse_json_data(jsondata[substr] );
            		}
            

            In substr ist der key - als der Eigenschaftsname des Wertes innerhalb des Objektes. Wenn die Eigenschaft wieder auf Objekt abprüfst, musst Du das über das Objekt referenzieren.

            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
            • 1 150d

              In der Tat, das funktioniert. (Ich bin neu hier - bei JavaScript -; ich weiß noch nicht so genau, was ich tue... :-) )

              Was ich möchte:

              Der JSON-String soll rekursiv geparst werden und aus dem Inhalt ioBroker-States angelegt werden. Folgendes habe ich versucht:

              function parse_json_data(jsondata) {
              
              	for (var substr in jsondata) {
              		
              		if (typeof substr === "object") {
              			return parse_json_data(substr);
              		} else {
              			adapter.log.info("substring: " + substr);
              		}
              		
              	}
              
              }
              
              

              Das klappt aber nicht, es wird nur der eine Eintrag "overview" erkannt. Die Rekursion funktioniert nicht.

              Wie kann ich zwischen "Knoten" und "Blatt" unterscheiden?

              paul53P Offline
              paul53P Offline
              paul53
              schrieb am zuletzt editiert von paul53
              #13

              @150d sagte: Der JSON-String soll rekursiv geparst werden und aus dem Inhalt ioBroker-States angelegt werden.

              Das macht man nicht mit dem JSON, sondern mit dem Objekt. Beispiel:

              const path = '0_userdata.0.inverter';
              const myobj = {"overview":{"lastUpdateTime":"2023-07-21 17:03:35","lifeTimeData":{"energy":860933},"lastYearData":{"energy":319056},"lastMonthData":{"energy":319056},"lastDayData":{"energy":24741},"currentPower":{"power":2135},"measuredBy":"INVERTER"}};
              
              function iter(id, obj) {
                for(let prop in obj) {
                    if(typeof obj[prop] == 'object') iter(id + '.' + prop, obj[prop]);
                    else {
                      let idDp = id + '.' + prop;
                      log(idDp + ': ' + obj[prop]);
                      // if(existsState(idDp)) setState(idDp, obj[prop]);
                      // else createState(idDp, obj[prop]);
                    }  
                }
              }
               
              iter(path, myobj);
              

              Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
              Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

              1 Antwort Letzte Antwort
              0
              • 1 150d

                (delete - checking... :-) )

                OliverIOO Offline
                OliverIOO Offline
                OliverIO
                schrieb am zuletzt editiert von OliverIO
                #14

                @150d

                du kannst das mal probieren

                function iterate(obj, stack) {
                        for (var property in obj) {
                            if (obj.hasOwnProperty(property)) {
                                if (typeof obj[property] == "object") {
                                    iterate(obj[property], stack + '.' + property);
                                } else {
                                    console.log(property + "   " + obj[property]);
                                }
                            }
                        }
                    }
                
                iterate(object, '')
                
                

                https://stackoverflow.com/questions/15690706/recursively-looping-through-an-object-to-build-a-property-list

                ich sehe ich gerade, das die stackvariable irgendwie nirgends zugewiesen wird, eigentlich sollte die dafür da sein, um den propertypfad mit auszugeben.

                Nachtrag, das war Paul schneller
                Evtl musst du auch noch Sonderbehandlung für Array und den anderen primitivtypen einbauen

                Meine Adapter und Widgets
                TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
                Links im Profil

                1 1 Antwort Letzte Antwort
                0
                • OliverIOO OliverIO

                  @150d

                  du kannst das mal probieren

                  function iterate(obj, stack) {
                          for (var property in obj) {
                              if (obj.hasOwnProperty(property)) {
                                  if (typeof obj[property] == "object") {
                                      iterate(obj[property], stack + '.' + property);
                                  } else {
                                      console.log(property + "   " + obj[property]);
                                  }
                              }
                          }
                      }
                  
                  iterate(object, '')
                  
                  

                  https://stackoverflow.com/questions/15690706/recursively-looping-through-an-object-to-build-a-property-list

                  ich sehe ich gerade, das die stackvariable irgendwie nirgends zugewiesen wird, eigentlich sollte die dafür da sein, um den propertypfad mit auszugeben.

                  Nachtrag, das war Paul schneller
                  Evtl musst du auch noch Sonderbehandlung für Array und den anderen primitivtypen einbauen

                  1 Offline
                  1 Offline
                  150d
                  schrieb am zuletzt editiert von 150d
                  #15

                  Ok, bin weitergekommen. Die Rekursion funktioniert jetzt "nach unten", aber sie "kommt nicht wieder hoch":

                  Nochmal zur Erinnerung das JSON, "prettified":

                  {
                  	"overview":{
                  		"lastUpdateTime":"2023-07-21 18:41:46",
                  		"lifeTimeData":{
                  			"energy":863588
                  		},
                  		"lastYearData":{
                  			"energy":321711
                  		},
                  		"lastMonthData":{
                  			"energy":321711
                  		},
                  		"lastDayData":{
                  			"energy":27396
                  		},
                  		"currentPower":{
                  			"power":1152
                  		},
                  		"measuredBy":"INVERTER"
                  	}
                  }
                  

                  Und hier der Code, den ich bis jetzt habe:

                  function parse_json_data(jsondata, prefix) {
                  	
                  	for (var substr in jsondata) {
                  		
                  		if (typeof jsondata[substr] === "object") {
                  			
                  			// found object, do recursion:
                  			
                  			return parse_json_data(jsondata[substr], prefix + substr + ".");
                  
                  		} else {
                  			
                  			// not an object, print key/value pair:
                  			
                  			adapter.log.info("JSON key/value: " + prefix + substr + " = " + jsondata[substr]);
                  				
                  		}
                  	}
                  }
                  
                  

                  Dies produziert folgende Ausgabe:

                  	JSON key/value: overview.lastUpdateTime = 2023-07-21 18:41:46
                  	JSON key/value: overview.lifeTimeData.energy = 863588
                  
                  

                  ... es wird also:

                  • das erste Objekt identifiziert (overview),
                  • darin ein key/value gefunden (lastUpdateTime),
                  • dann wieder ein Objekt (lifeTimeData),
                  • darin ein key/value (energy).

                  Aber dann ist Schluss, weitere Behandlung findet nicht mehr statt.

                  Warum geht die for-Schleife nicht zum nächsten item (lastYearData) weiter?

                  paul53P 1 Antwort Letzte Antwort
                  0
                  • 1 150d

                    Ok, bin weitergekommen. Die Rekursion funktioniert jetzt "nach unten", aber sie "kommt nicht wieder hoch":

                    Nochmal zur Erinnerung das JSON, "prettified":

                    {
                    	"overview":{
                    		"lastUpdateTime":"2023-07-21 18:41:46",
                    		"lifeTimeData":{
                    			"energy":863588
                    		},
                    		"lastYearData":{
                    			"energy":321711
                    		},
                    		"lastMonthData":{
                    			"energy":321711
                    		},
                    		"lastDayData":{
                    			"energy":27396
                    		},
                    		"currentPower":{
                    			"power":1152
                    		},
                    		"measuredBy":"INVERTER"
                    	}
                    }
                    

                    Und hier der Code, den ich bis jetzt habe:

                    function parse_json_data(jsondata, prefix) {
                    	
                    	for (var substr in jsondata) {
                    		
                    		if (typeof jsondata[substr] === "object") {
                    			
                    			// found object, do recursion:
                    			
                    			return parse_json_data(jsondata[substr], prefix + substr + ".");
                    
                    		} else {
                    			
                    			// not an object, print key/value pair:
                    			
                    			adapter.log.info("JSON key/value: " + prefix + substr + " = " + jsondata[substr]);
                    				
                    		}
                    	}
                    }
                    
                    

                    Dies produziert folgende Ausgabe:

                    	JSON key/value: overview.lastUpdateTime = 2023-07-21 18:41:46
                    	JSON key/value: overview.lifeTimeData.energy = 863588
                    
                    

                    ... es wird also:

                    • das erste Objekt identifiziert (overview),
                    • darin ein key/value gefunden (lastUpdateTime),
                    • dann wieder ein Objekt (lifeTimeData),
                    • darin ein key/value (energy).

                    Aber dann ist Schluss, weitere Behandlung findet nicht mehr statt.

                    Warum geht die for-Schleife nicht zum nächsten item (lastYearData) weiter?

                    paul53P Offline
                    paul53P Offline
                    paul53
                    schrieb am zuletzt editiert von paul53
                    #16

                    @150d
                    Bei meinem Vorschlag kommt das im Log:

                    19:08:57.895	info	javascript.1 (2174) script.js.common.ObjectStruct2ID: 0_userdata.0.inverter.overview.lastUpdateTime: 2023-07-21 17:03:35
                    19:08:57.895	info	javascript.1 (2174) script.js.common.ObjectStruct2ID: 0_userdata.0.inverter.overview.lifeTimeData.energy: 860933
                    19:08:57.895	info	javascript.1 (2174) script.js.common.ObjectStruct2ID: 0_userdata.0.inverter.overview.lastYearData.energy: 319056
                    19:08:57.895	info	javascript.1 (2174) script.js.common.ObjectStruct2ID: 0_userdata.0.inverter.overview.lastMonthData.energy: 319056
                    19:08:57.895	info	javascript.1 (2174) script.js.common.ObjectStruct2ID: 0_userdata.0.inverter.overview.lastDayData.energy: 24741
                    19:08:57.895	info	javascript.1 (2174) script.js.common.ObjectStruct2ID: 0_userdata.0.inverter.overview.currentPower.power: 2135
                    19:08:57.896	info	javascript.1 (2174) script.js.common.ObjectStruct2ID: 0_userdata.0.inverter.overview.measuredBy: INVERTER
                    

                    Das return in Zeile 9 verhindert die weitere Iteration.

                    Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
                    Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

                    1 1 Antwort Letzte Antwort
                    0
                    • paul53P paul53

                      @150d
                      Bei meinem Vorschlag kommt das im Log:

                      19:08:57.895	info	javascript.1 (2174) script.js.common.ObjectStruct2ID: 0_userdata.0.inverter.overview.lastUpdateTime: 2023-07-21 17:03:35
                      19:08:57.895	info	javascript.1 (2174) script.js.common.ObjectStruct2ID: 0_userdata.0.inverter.overview.lifeTimeData.energy: 860933
                      19:08:57.895	info	javascript.1 (2174) script.js.common.ObjectStruct2ID: 0_userdata.0.inverter.overview.lastYearData.energy: 319056
                      19:08:57.895	info	javascript.1 (2174) script.js.common.ObjectStruct2ID: 0_userdata.0.inverter.overview.lastMonthData.energy: 319056
                      19:08:57.895	info	javascript.1 (2174) script.js.common.ObjectStruct2ID: 0_userdata.0.inverter.overview.lastDayData.energy: 24741
                      19:08:57.895	info	javascript.1 (2174) script.js.common.ObjectStruct2ID: 0_userdata.0.inverter.overview.currentPower.power: 2135
                      19:08:57.896	info	javascript.1 (2174) script.js.common.ObjectStruct2ID: 0_userdata.0.inverter.overview.measuredBy: INVERTER
                      

                      Das return in Zeile 9 verhindert die weitere Iteration.

                      1 Offline
                      1 Offline
                      150d
                      schrieb am zuletzt editiert von
                      #17

                      @paul53 said in JSON interpretieren:

                      Das return in Zeile 9 verhindert die weitere Iteration.

                      Jawohl, das war es. (Dieses JavaScript ist vielleicht krümelkackerisch... :-) )

                      Danke!

                      Und danke an alle beteiligten!

                      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
                      FAQ Cloud / IOT
                      HowTo: Node.js-Update
                      HowTo: Backup/Restore
                      Downloads
                      BLOG

                      375

                      Online

                      32.6k

                      Benutzer

                      82.0k

                      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