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...
4 Antworten
-
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 -
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); myResultgibt 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]); myResultdann aber mit dem bekannten Verhalten, dass das Objekt am Ende so aussieht: [[json1],[json2]].
-
Hallo Phillip,
nochmal vielen Dank - mittleweile funktioniert es, wie in deiner ersten Variante beschrieben, also mit array(json1, json2). Dafür habe ich die Funktion, die json1 und json2 erstellt angepasst. Die unterschedliche Handhabung von JSON-Objekte und Arrays in Ninox (auch wenn dort nur ein Element drinsteckt) verwirrt mich ein wenig. In der textlichen Ausgabe im Formelfeld sehen die identisch aus, intern scheint das aber unterscheidlich zu sein.
Jedenfalls vielen Dank, manachmal braucht einen Sidekick um nochmal anders an die Sache ran zu gehen...
Content aside
- Status Answered
- vor 13 StundenZuletzt aktiv
- 4Antworten
- 35Ansichten
-
2
Folge bereits
