CardDAV-Client - Objekte in ein Array packen
Ich arbeite gerade an der Implementation eines CardDAV-Clienten in Ninox. In diesem Zusammenhang habe ich gerade Problem, das ich sowohl mithilfe der Dokumentation as auch hier im Forum nicht gelöst bekomme:
Allgemein formuliert, habe ich ein Array contacts, das mithilfe einer Funktion mit vCard-Objekten gefüllt werden soll.
Die Funktion parseVCards bildet in einer Schleife einzelne vCard-Objekte. Nach jedem Durchgang soll dem Array contacts ein {VCard-Objekt} hinzugefügt werden:
Hier die Funktion, deren Rückgabewert contacts immer eine leere Menge ist:
function parseContacts(responseText : text) do
let contacts := [];
let jsonResponse := parseXML(responseText);
let responses := jsonResponse.multistatus.response;
for i in range(0, count(responses)) do
let response := item(responses, i);
let propstat := response.propstat;
let status := propstat.status.@;
if status = "HTTP/1.1 200 OK" then
let href := response.href.@;
let prop := propstat.prop;
let addressData := prop.'address-data'.@;
if addressData then
let vcardText := text(addressData);
let contact := parseVCard(vcardText);
setItem(contact, "href", href);
contacts := array(contacts, contact);
end
end
end;
contacts
end;
Ein Beispiel für ein contact-Objekt (bevor der Schlüssel href hinzugefügt wird):
{
"FN":"John Doe",
"lastName":"Doe",
"firstName":"John",
"EMAIL":"john.doe@mailserver.com",
"UID":"a90ddcdf-7a7a-4b1e-b648-951e8ae521af"
}
Das contacts-Array soll somit folgende Struktur aufweisen:
[{vCardObj1}, {vCardObj2}, {vCardObj3}, …]
Das Problem liegt in der Zeile 19 der obigen Funktion:
contacts := array(contacts, contact);
Diese Anweisung funktioniert so nicht, und die folgenden fantasievollen Varianten funktionieren ebenfalls nicht (falls jemand auf die gleiche Idee käme…
contacts := array(contacts, [contact]); oder
contacts := array(contacts, {ontact}];
Kann mir hierbei jemand weiterhelfen?
Danke,
Stefan
4 Antworten
-
Hi. Versuche bitte in Zeile 2 das Array auf ein [any] Typ festzulegen und in Zeile 17 deinen eigenen Lösungsansatz zu benutzen. Die Arrayfunktion array() verbindet letztlich zwei Arrays zu einem neuen, deshalb muß die Variable "contact" vorab in [] gesetzt werden.
let contacts := [{}][= null];
contacts := array(contacts, [contact]);
Mirko
-
Hallo Mirko,
Danke für deinen (korrekten) Lösungsvorschlag!
Nachdem ich
let contacts := [{}];
definiert hatte, gab die Funktion parseContacts das gewünschte Array zurück.
Der CardDAV-Client ist inzwischen fertig.
Stefan
-
Wow! Hut ab! Ich kannte die Funktion debugValueInfo() bislang nicht und auch
[= null])
war mir nicht bekannt.
Aber du hast recht: Ohne [= null] ist das erste Objekt im Array ein leeres Objekt, so dass es noch erforderlich war, dieses Objekt zu elimineren mit:
contacts := slice(contacts, 1, count(contacts));
Mit deiner Lösung kann diese Zeile nun entfallen und jetzt ist der Code perfekt!
Ganz herzlichen Dank für deinen Beitrag!
Stefan
Content aside
- Status Answered
- vor 2 MonatenZuletzt aktiv
- 4Antworten
- 40Ansichten
-
2
Folge bereits