ralphi: Anfänger Frage JSON.parse()

Hi Leute,

wie komm ich an die Werte im mehrdimensionalen JSON, wenn ich die Anfangs-Feldnamen nicht weiß?

Ich lese mit einem Raspi die Temperatursensoren TX29IT (zur Zeit im Angebot mit Station) aus und speicher die  Daten in einem JSON.

Jetzt bekomme ich nicht immer die gleichen Sensoren (nicht alle aktiv, bzw. auch mal vom Nachbarn). D.h. das erste Feld ist unbekannt.
Wie kann ich einfach alle aktiven Sensoren, ohne bekannte ID in ein Array speichern?

  
// hohl ich per AJAX  
var json = '{"ID6c":{"init":"0","batt":"0","ID":"6c","temp":"-0.3","stamp":"1424078437"},"IDa0":{"hy":"15","init":"0","batt":"128","ID":"a0","temp":"20.4","stamp":"1424049514"},"IDc":{"hy":"48","init":"0","batt":"0","ID":"c","temp":"22.1","stamp":"1424077716"}}';  
  
// ID der Sensoren: ID6c, IDa0 IDc wechseln / nicht immer verfügbar  
obj = JSON.parse(json);  
alert (obj.ID6c.temp); // -0.3  
// alert (obj.?.temp); 

Viele Grüße aus LA

--
ralphi
  1. hi,

    Wie kann ich einfach alle aktiven Sensoren, ohne bekannte ID in ein Array speichern?

    Erfasse sie in einer Schleife:  for(att in obj)

    Schöne Grüße.

    1. Nicht alles was einfach ist, ist genial. Aber alles was genial ist, ist einfach :-) (AE)
      for(attr in obj) - futzt - danke

      Viele Grüße aus LA

      --
      ralphi
      1. Hi,

        Nicht alles was einfach ist, ist genial. Aber alles was genial ist, ist einfach :-) (AE)
        for(attr in obj) - futzt - danke

        Danke auch, jetzt will ich aber mal was von Dir wissen: Welche Hardware zum Empfang der Signale von der Wetterstation setzt Du ein? Gibt es dafür Erweiterungskarten?

        Schöne Grüße.

        1. Hab von seegel-systeme. ein Modul. (Sehr schnelle Lieferung)

          Hab schon einiges vorher ausprobiert (ohne Erfolg) :-(

          Viele Grüße aus LA

          --
          ralphi
          1. Hab von seegel-systeme. ein Modul. (Sehr schnelle Lieferung)

            Hab schon einiges vorher ausprobiert (ohne Erfolg) :-(

            Hi danke für die Info. Ich glaub, das Bastelfieber hat mich wieder ;)

            Nein, nicht das Rad neu erfinden, sondern das, was vorhanden ist, zweckmäßig verwenden. War schon immer mein Leitsatz ;)

            Schöne Grüße.

  2. Hakuna matata!

    Wie kann ich einfach alle aktiven Sensoren, ohne bekannte ID in ein Array speichern?

    Die SesorID wird als Eigenschaftsname in dem JSON-Objekt hinterlegt, der Sesonstzustand wird in dem Wert zu diesem Eigenschaftsname hinterlegt. Hab ich das richtig verstande?

    Du kannst alle Eigenschaftsnamen eines Objekts (also hier die SensorIDs) mit Object.getOwnPropertyNames( myObject ) auslesen. Aus diesem Array der SensorIDs, kannst du dann einfach ein Array der Sensor-Zustände machen, in dem du darüber mapst:

    var sensors = Object.getOwnPropertyNames( obj ).map( function ( sensorId ) {  
       return obj[ sensorId ];  
    });
    

    Dann hast du allerdings nur die Sensor-Zustände und der Bezug zur SensorID ginge verloren. Du könntest die Map-Funktion so anpassen, dass du immer beides zur Verfügung hast:

    var sensors = Object.getOwnPropertyNames( obj ).map( function ( sensorId ) {  
       return {  
          id : sensorId,  
          state : obj[ sensorId ]  
       }  
    });
    
    --
    “All right, then, I'll go to hell.” – Huck Finn
    1. also
      Object.getOwnPropertyNames(obj).sort()
      klappt - danke
      Was map() ist (genau passiert), hab ich nix gefunden :-|

      Viele Grüße aus LA

      --
      ralphi
      1. Lieber ralphi,

        Was map() ist (genau passiert), hab ich nix gefunden :-|

        wo hast Du denn gesucht? Im Wiki hier steht noch nichts dazu. Aber auf Mozillas Developer-Seiten, sowie auf Microsofts Developer-Seiten findet man etwas.

        CanIUse verweist auf ECMAScript5, die wiederum behaupten, dass diese Methode eines Arrays mittlerweile hinreichend unterstützt wird.

        Liebe Grüße,

        Felix Riesterer.

        --
        "Wäre die EU ein Staat, der die Aufnahme in die EU beantragen würde, müsste der Antrag zurückgewiesen werden - aus Mangel an demokratischer Substanz." (Martin Schulz, Präsident des EU-Parlamentes)
        1. Hi Felix,

          Aber auf Mozillas Developer-Seiten, ..

          jetzada :-) - mal sehen, was ich in meinem Fall verwende.

          Viele Grüße aus LA

          --
          ralphi
        2. Liebe Ingrid,

          Im Wiki hier steht noch nichts dazu.

          aber jetzt schon.

          Liebe Grüße,

          Felix Riesterer.

          --
          "Wäre die EU ein Staat, der die Aufnahme in die EU beantragen würde, müsste der Antrag zurückgewiesen werden - aus Mangel an demokratischer Substanz." (Martin Schulz, Präsident des EU-Parlamentes)
    2. sowohl die Antwort von 1UP, als auch von hotti futzt.

      Die SesorID wird als Eigenschaftsname in dem JSON-Objekt hinterlegt, der Sesonstzustand wird in dem Wert zu diesem Eigenschaftsname hinterlegt. Hab ich das richtig verstande?

      Der Grundgedanke ist, Module als Kacheln (bin KEIN Win8 Freund!) mit unterschiedlichen Messwerten und Daten aus der Hausautomation in eine (Web)App zu packen.
      Das ganze soll flexibel sein. D.h. je nachdem welche Funk-, 1Wire-Sensoren bzw Wetterdaten von underground vorhanden sind, sollen die Kacheln auftauchen.

      Je nach Objekt, gibt es unterschiedliche Kacheln:
      zB:
      Kachel1: Bez - Symbol -  Wert
      Kachel2: Bez1 - Wert1 - Bez2. - Wert2
      und weitere:
      entsprechend gibts unterschiedliche Json Objekte pro Kachel.

      {"Kachel":"Wert"}
      {"Kachel": {weiter Daten} }

      Die einzelnen JSON werden dann in ein großes JSON zusammengepackt und per Ajax ausgelesen.

      Ich denke das gewünschte Prinzip kann man sehen. Ups - jetzt wo ichs schreib: Da sind noch Logikfehler drin :-|

      Viele Grüße aus LA

      --
      ralphi