0

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

null
    • mirko3
    • vor 4 Monaten
    • Gemeldet - anzeigen

    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

    • Dr_Stefan_Philipp
    • vor 4 Monaten
    • Gemeldet - anzeigen

    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

      • mirko3
      • vor 4 Monaten
      • Gemeldet - anzeigen

      Hallo Stefan. Wenn Du es so benutzt, dann hat dein Array aber schlußendlich ein zusätzliches, leeres Objekt. Deshalb [=null] zum löschen des Überflüssigen. Dann bleibt der Typ erhalten, das Anfangsarray ist aber leer. Zum Test

      debugValueInfo([{}][= null])
      

      ergibt: any([])

      debugValueInfo([{}])
      

      ergibt: any([{}])

      Mirko

    • Dr_Stefan_Philipp
    • vor 4 Monaten
    • Gemeldet - anzeigen

    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 4 MonatenZuletzt aktiv
  • 4Antworten
  • 46Ansichten
  • 2 Folge bereits