0

mergeJSON()

Weil es die Funktion in Ninox ja meines Wissens ja nicht gibt hab ich mir selber geholfen.

Kurz zum Ziel:

mergeJSON - zwei 2-diemsionale JSON-Objekte sollen verschmolzen werden. Also zum Beispiel:

let json1 := [{name: "Hans", nachname: "Meier", alter: 22}] und

let json2 := [{name: "Fritz", nachname: "Müller", alter: 33}].

Ich dachte ja eigentlich das könnte man mit der array()-Funktion bewerkstelligen, also:

let merged := array(json1, json2)

Das ergäbe aber das Objekt:

[[{name: "Hans", nachname: "Meier", alter: 22}] , [{name: "Fritz", nachname: "Meier", alter: 22}]]

gewünscht ist aber:

[{name: "Hans", nachmane: "Meier", alter: 22}, {name: "Fritz", nachmane: "Müller", alter: 33}]

Jetzt habe ich mir eine Funktion "gebastelt", die die JSON-Objekte zunächst per formatJSON() in Strings konvertiert und am Ende per parseJSON() wieder in ein JSON-Objekt wandelt:

 

function mergeJSON(objekte : any[]) do
   "1. Jedes Objekt in einen Text umwandeln und in ein neues Text-Array schreiben";
   let stringArray := for i in objekte do
      let str := formatJSON(i);
      if i != null then
         substring(str, 1, length(str) - 1)
      end
    end;
    "2. Die Texte mit Komma verbinden und in eckige Klammern setzen";
       let finalString := "[" + join(stringArray, ",") + "]";
    "3. Zurück in ein echtes JSON-Array parsen";
       parseJSON(finalString)
end;

Gibt es da keine elegantere Lösung? Man kann sich vorstellen, dass das bei großen Objekten ziemlich langsam ist...

3 Antworten

null
    • Pushing the Boundaries of Ninox
    • Gotje_Ing
    • vor 7 Stunden
    • Gemeldet - anzeigen

    Moin  ,

    solange man die JSON nicht aus Textfeldern holt oder ganz bestimmte Sonderkonstellationen mit verschachtelten Elementen existiert, benötigt man nur die Array Funktion. Hier das Beispiel von dir:
     

    let json1 := [{
                name: "Hans",
                nachname: "Meier",
                alter: 22
            }];
    let json2 := [{
                name: "Fritz",
                nachname: "Müller",
                alter: 33
            }];
    let myResult := array(json1, json2);
    debugValueInfo(myResult)
    

    ergibt dann:

    any([{"name":"Hans","nachname":"Meier","alter":22},{"name":"Fritz","nachname":"Müller","alter":33}])
    

    Wenn man allerdings das obere geschachtelte Element benötigt, dann wäre es etwas komplexer, je nach Ursprung.
    Grüße Philipp

    • Frank_Heitmann.1
    • vor 5 Stunden
    • Gemeldet - anzeigen

    Hallo Phillip,

    erstmal bestend Dank für die Info. Das Beispiel wie von dir geschrieben fnktioniert beir mir auch. In Wirklichkeit kommen die JSON-Daten natürlich aus einem Formelfeld. Dahinter steckt eine Funktion, die zum Abschluss das Objekt mit parseJSON zusammensetzt.

    Jetzt habe ich mal probiert die Ergebisse aus den Formelfeldern per Copy/paste in die beiden Variablen einzutragen - dann funktioniert es.

    Nehme ich die Formelfelder jedoch als Variableninhalt:

    let json1 := 'Zahlungsdaten Hauptvertrag'
    let json2 := 'Zahlungsdaten Vertragsänderung 1'
    let myResult := array(json1, json2);
    myResult
    

    gibt es direkt einen Ninox-Fehler: "Die Funktion ist nicht definiert: array(any,any). Ohne Fehler funktioniert zwar:

    let json1 := 'Zahlungsdaten Hauptvertrag'
    let json2 := 'Zahlungsdaten Vertragsänderung 1'
    let myResult := array([json1], [json2]);
    myResult
    

    dann aber mit dem bekannten Verhalten, dass das Objekt am Ende so aussieht: [[json1],[json2]].

      • Pushing the Boundaries of Ninox
      • Gotje_Ing
      • vor 3 Stunden
      • Gemeldet - anzeigen

       
      Alles klar, dann ist das Problem aber ein anderes, welches keine String-Umwandlung braucht.

      Angenommen die Formelfelder geben tatsächlich Arrays aus, wie von dir beschrieben, dann geht folgendes Script:
       

      let json1 := for i in 'Formelfeld 1' do
              i
          end;
      let json2 := for i in 'Formelfeld 2' do
              i
          end;
      debugValueInfo(array(json1, json2))
      

      Es löst die Arrays wieder in einzelne Elemente auf, ohne eine Vertiefungsebene zu erzeugen.
      Wenn es immer nur ein Element in den Formelfeldern geben würde, also kein Array, dann würde auch folgendes gehen:
      Formelfeld1 und 2 geben JSON, kein Array: 

      {
          name: "Hans",
          nachname: "Meier",
          alter: 22
      }
      

      Zusammengefasst:

      let json1 := 'Formelfeld 1';
      let json2 := 'Formelfeld 2';
      debugValueInfo([json1, json2])
      

Content aside

  • vor 3 StundenZuletzt aktiv
  • 3Antworten
  • 17Ansichten
  • 2 Folge bereits