Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. einen json String filtern und Bereiche löschen.

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    einen json String filtern und Bereiche löschen.

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

      Hallo, ich brauch mal Hilfe.
      Finde hierzu leider nichts was mir mit meinen wenigen Kentnissen hilft.

      Ich habe in einem Datenpunkt einen String, den ich FIltern und in einen neuen Datenpunkt schreiben möchte.

      Hier ein beispielhafter Json:

      [
      	{
      		"id": "1",
      		"name": "Name 1",
      		"status": "ok",
      	},
      	{
      		"id": "2",
      		"name": "Name 2",
      		"status": "nok",
      	},
      	{
      		"id": "3",
      		"name": "Name 3",
      		"status": "ok",
      	}
      	....
      ]
      

      Nun möchte ich den "status" prüfen und überall wo "nok" (kann öffters vorkommen) steht, sollen die ganzen Blöcke aus dem String entfernt und dieser neu in einem anderen Datenpunkt gespeichert werden.

      2024-08-03 08 28 00.jpg

      Kann mir da jemand helfen (blockly oder js)

      bahnuhr paul53 haus-automatisierung 3 Replies Last reply Reply Quote 0
      • MartinP
        MartinP last edited by

        @stenmic https://forum.iobroker.net/topic/57044/json-array-auslesen-blockly-javascript-nodered/4

        1 Reply Last reply Reply Quote 0
        • bahnuhr
          bahnuhr Forum Testing Most Active @stenmic last edited by

          @stenmic

          so:

          var arr = [];
          var DP_alt = '[{"id": "1","name": "Name 1","status": "ok"},{"id": "2","name": "Name 2","status": "nok"},{"id": "3","name": "Name 3","status": "ok"},{"id": "11","name": "Name 1","status": "ok"},{"id": "12","name": "Name 2","status": "nok"},{"id": "13","name": "Name 3","status": "ok"},{"id": "21","name": "Name 1","status": "ok"},{"id": "22","name": "Name 2","status": "nok"},{"id": "23","name": "Name 3","status": "ok"}]'
          var obj = JSON.parse(DP_alt);
          
          for (x=0;x<obj.length;x++) {
              if (obj[x].status == "ok") { arr.push({id: obj[x].id, name: obj[x].name, status: obj[x].status}); }
          }
          setState("javascript.0.test", JSON.stringify(arr));
          
          

          Anmerkung:
          Falls du wirklich hinter "ok" noch ein , hast dann musst du dies löschen.

          S 1 Reply Last reply Reply Quote 1
          • S
            stenmic @bahnuhr last edited by

            @bahnuhr
            perfekt, vielen Dank…
            Das , im Beispiel ist ein natürlich ein Fehler von mir.
            im org. String passt es.

            1 Reply Last reply Reply Quote 0
            • paul53
              paul53 @stenmic last edited by paul53

              @stenmic
              Mit Trigger auf den Quell-Datenpunkt:

              // IDs eintragen!
              const idSrc = '';
              const idDst = '';
              
              function filter(json) {
                  const arrSrc = JSON.parse(json);
                  const arrDst = [];
                  for(let i = 0; i < arrSrc.length; i++) {
                      const obj = arrSrc[i];
                      if(obj.status == 'ok') arrDst.push(obj);
                  }
                  setState(idDst, JSON.stringify(arrDst), true);
              }
              
              filter(getState(idSrc).val); // Skriptstart
              on(idSrc, function(dp) {
                  filter(dp.state.val);
              });
              
              1 Reply Last reply Reply Quote -1
              • mickym
                mickym Most Active last edited by

                Wieder mal ein Beispiel, wie einfach das mit JSONATA ging, aber man sich lieber mit Schleifen und einer Menge Code das Leben schwer macht. man muss es halt nur anders formulieren und sagen, man will alle Objekte haben, die ok sind.

                S 1 Reply Last reply Reply Quote 0
                • haus-automatisierung
                  haus-automatisierung Developer Most Active @stenmic last edited by haus-automatisierung

                  @stenmic sagte in einen json String filtern und Bereiche löschen.:

                  Nun möchte ich den "status" prüfen und überall wo "nok" (kann öffters vorkommen) steht, sollen die ganzen Blöcke aus dem String entfernt und dieser neu in einem anderen Datenpunkt gespeichert werden.

                  z.B.

                  const list = JSON.parse(getState('0_userdata.0.blabla1').val);
                  const listOk = list.filter(r => r.status === 'ok');
                  setState('0_userdata.0.blabla2', JSON.stringify(listOk), true);
                  

                  Das vereinfach das Beispiel von @paul53 etwas:

                  // IDs eintragen!
                  const idSrc = '';
                  const idDst = '';
                   
                  function filter(json) {
                      const arrSrc = JSON.parse(json);
                      const arrDst = arrSrc.filter(r => r.status === 'ok');
                      setState(idDst, JSON.stringify(arrDst), true);
                  }
                  
                  filter(getState(idSrc).val);
                  on(idSrc, (dp) => filter(dp.state.val));
                  
                  bahnuhr S 3 Replies Last reply Reply Quote 1
                  • bahnuhr
                    bahnuhr Forum Testing Most Active @haus-automatisierung last edited by

                    @haus-automatisierung
                    cool,
                    ist das mit dem "filter" irgendwo beschrieben ?

                    haus-automatisierung 1 Reply Last reply Reply Quote 0
                    • haus-automatisierung
                      haus-automatisierung Developer Most Active @bahnuhr last edited by

                      @bahnuhr sagte in einen json String filtern und Bereiche löschen.:

                      ist das mit dem "filter" irgendwo beschrieben ?

                      Klar, ist ja Standard-JavaScript (in diesem Fall mit einer Arrow-Function):

                      https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter

                      1 Reply Last reply Reply Quote 0
                      • bahnuhr
                        bahnuhr Forum Testing Most Active @haus-automatisierung last edited by bahnuhr

                        @haus-automatisierung
                        Kann in deinem Beispiel on triggern?

                        weil idSrc ist ja ""

                        edit:
                        Frage ist Unsinn, denn es steht ja extra dabei ID eintragen.
                        Hatte ich überlesen.

                        mfg

                        haus-automatisierung 1 Reply Last reply Reply Quote 0
                        • haus-automatisierung
                          haus-automatisierung Developer Most Active @bahnuhr last edited by

                          @bahnuhr Daher wohl der Kommentar darüber. Der TO hat die IDs seiner Darenpunkte nicht genannt

                          S 1 Reply Last reply Reply Quote 0
                          • S
                            stenmic @haus-automatisierung last edited by

                            danke für alle Lösungen 👍

                            1 Reply Last reply Reply Quote 0
                            • S
                              stenmic @haus-automatisierung last edited by stenmic

                              @haus-automatisierung

                              bin gerade unterwegs und kann es noch nicht testen.
                              Ich muss nach nok suchen und diese Blöcke sollen gelöscht werden.
                              Eure Beispiele suchen nach ok und behalten diese.
                              „ok“ kann bei mir leider auch anderes heißen.
                              passt das dann so?

                              
                              const list = JSON.parse(getState('0_userdata.0.blabla1').val);
                              const listOk = list.filter(r => r.status !== 'nok');
                              setState('0_userdata.0.blabla2', JSON.stringify(listOk), true);
                              
                              
                              
                              haus-automatisierung 1 Reply Last reply Reply Quote 0
                              • haus-automatisierung
                                haus-automatisierung Developer Most Active @stenmic last edited by

                                @stenmic Ja

                                1 Reply Last reply Reply Quote 1
                                • S
                                  stenmic @mickym last edited by

                                  @mickym sagte in einen json String filtern und Bereiche löschen.:

                                  Wieder mal ein Beispiel, wie einfach das mit JSONATA ging, aber man sich lieber mit Schleifen und einer Menge Code das Leben schwer macht. man muss es halt nur anders formulieren und sagen, man will alle Objekte haben, die ok sind.

                                  @mickym also ich find jetzt den 3 Zeiler von @haus-automatisierung nicht schlimm.
                                  (wenn man die JavaScript-docs im Schlaf aufzählen kann, ist alles voll einfach 😁 )

                                  mickym 1 Reply Last reply Reply Quote 0
                                  • mickym
                                    mickym Most Active @stenmic last edited by mickym

                                    @stenmic Na anhand deines Beispiels nur der Vollständigkeit die JSONATA Lösung:

                                    setState('0_userdata.0.Test.JSON_target',JSON.stringify(await jsonataExpression(JSON.parse(getState('0_userdata.0.Test.JSON_source').val),'$[status != "nok"]')), true);
                                    

                                    letztlich reduziert sich die ganze Logik auf diesen Ausdruck:

                                    $[status != "nok"]
                                    

                                    Hier die Blockly-Version
                                    3da59a81-6524-42e5-a206-737606595240-image.png

                                    Ausgewählte Blöcke exportieren
                                    <xml xmlns="https://developers.google.com/blockly/xml">
                                     <block type="update" id="U7XhnINUb5BA~asv%U~}" x="-212" y="-59">
                                       <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation>
                                       <field name="OID">0_userdata.0.Test.JSON_target</field>
                                       <field name="WITH_DELAY">FALSE</field>
                                       <value name="VALUE">
                                         <block type="convert_object2json" id="Tj:1;;d?[z*VGJ{GIpjS">
                                           <field name="PRETTIFY">FALSE</field>
                                           <value name="VALUE">
                                             <block type="convert_jsonata" id="HaZqIt}bK{;7W#.?zsDH">
                                               <value name="EXPRESSION">
                                                 <shadow type="text" id="B@rj1Ji@!vB*`.70=3NZ">
                                                   <field name="TEXT">$[status != "nok"]</field>
                                                 </shadow>
                                               </value>
                                               <value name="TARGET">
                                                 <block type="get_value" id="~Bo-)1$QbquS^t1bK~ph">
                                                   <field name="ATTR">val</field>
                                                   <field name="OID">0_userdata.0.Test.JSON_source</field>
                                                 </block>
                                               </value>
                                             </block>
                                           </value>
                                         </block>
                                       </value>
                                     </block>
                                    </xml>
                                    

                                    https://try.jsonata.org/47UBND9kh

                                    S 1 Reply Last reply Reply Quote 0
                                    • S
                                      stenmic @mickym last edited by

                                      @mickym gebe zu... auch geil!

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

                                      Support us

                                      ioBroker
                                      Community Adapters
                                      Donate

                                      1.1k
                                      Online

                                      31.7k
                                      Users

                                      79.7k
                                      Topics

                                      1.3m
                                      Posts

                                      6
                                      17
                                      428
                                      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