Top level of json must be a dict. keys of the dict are RT names.

Frage: is the first RT never an array?

Do not use sheet name, but only content of hidden rows

Das Datenmodell in LinkAhead legt fest, welche Arten von Records es in einer LinkAhead-Instanz gibt und wie diese aussehen. Diese Datenmodell kann auch in einem JSON Schema repräsentiert werden, dass die Struktur von JSON Dateien festlegt, die zu dem Datenmodell gehörige Records enthält. Zum Beispiel kann das folgende JSON den Record einer Person beschreiben:

{
    "Person": {
        "family_name": "Steve",
        "given_name": "Stevie"
    }
}

Das JSON Schema schreibt eine konkrete Struktur vor und kann zugehörige JSON Dateien können genutzt werden um Daten zu bestimmten Record Strukturen zu repräsentieren. Beispielsweise könnte man ein JSON Schema erstellen, dass es erlaubt “Training” Records mit Informationen zu abgehaltenen Trainings speichern. Dies ist insbesondere wertvoll beim Datenim- und export. Man könnte basierend auf dem im Folgenden beschriebenen Webformulare basieren oder es nutzen um in LinkAhead gespeicherte Objekte als JSON zu exportieren.

Im Folgenden wird beschrieben, wie JSON Dateien mit solchen Records in XLSX Dateien umgewandelt werden, bzw. wie aus XLSX-Dateien JSON Dateien mit Records erstellt werden.

Der Attributname (oben “Person”) legt den RecordType fest und der Wert diese Attributs kann entweder ein Objekt oder eine Liste sein. Ist es ein Objekt (wie im obigen Beispiel), so wird ein einzelner Record repräsentiert. Bei einer Liste mehrere Records, die den gleichen RecordType als Parent haben. Die Properties des Records (oben “family_name” und “given_name”) werden zu Spalten im XLSX. Die Properties haben wiederum einen Attributnamen und einen Wert. Der Wert kann a. primitiv (Text, Zahl, Boolean, …) b. ein Record c. eine Liste von primitiven Typen d. eine Liste von Records sein.

In den Fällen a. und c. wird in XLSX eine Zelle in der zur Property gehörigen Spalte erstellt. Im Fall b. wird prinzipiell für die Properties des Records Spalten erstellt. Tatsächlich wird der referenzierte Record genauso behandelt wie der ursprüngliche. D.h. die Fälle a.-d. werden wieder für die einzelnen Properties betrachtet. Für den Fall d. ist die zweidimensionale Struktur eines XLSX Blatts nicht ausreichend. Daher werden für solche Fälle neue XLSX Blätter erstellt. In diesen werden die referenzierten Records behandelt wie oben beschrieben. Es gibt jedoch zusätzliche Spalten die es erlauben zu erkennen von welchem Record die Records referenziert werden.

Wir betrachten diese vier Fälle nun im Detail: a. Properties mit primitiven Datentypen

{
    "Training": {
        "date": "2023-01-01",
        "url": "www.indiscale.com",
        "duration": 1.0,
        "participants": 1,
        "remote": false
    }
}

Dies würde in einem XLSX Blatt mit dem folgenden Inhalt abgebildet:

date url duration participants remote
2023-01-01 www.indiscale.com 1.0 1 false
  1. Property, die einen Record referenziert
{
    "Training": {
        "date": "2023-01-01",
        "supervisor": {
            "family_name": "Steve",
            "given_name": "Stevie",
        }
    }
}

Dies würde in einem XLSX Blatt mit dem folgenden Inhalt abgebildet:

date supervisor.family_name supervisor.given_name
2023-01-01 Steve Stevie

Beachten Sie, dass die Spaltennamen umbenannt werden dürfen. Die Zuordnung der Spalte zu Properties von Records wird über den Inhalt von versteckten Zeilen gewährleistet.

  1. Properties, die Listen mit Werten von primitiven Datentypen enthalten
{
    "Training": {
        "url": "www.indiscale.com",
        "subjects": ["Math", "Physics"],
    }
}

Dies würde in einem XLSX Blatt mit dem folgenden Inhalt abgebildet:

url subjects
www.indiscale.com Math;Physics

Die Listenelemente werden separiert von ; in die Zelle geschrieben.

  1. Properities, die Listen mit Referenzen enthalten
{
    "Training": {
        "date": "2023-01-01",
        "coach": [
            {
              "family_name": "Sky",
              "given_name": "Max",
              },{
              "family_name": "Sky",
              "given_name": "Min",
              }],
    }
}

Da die beiden Coaches nicht vernünftig in einer Zelle dargestellt werden können, bedarf es nun eines weiteren Tabellenblatts, das die Eigenschaften der Coaches enthält.

Das Blatt zu den Trainings enthält in diesem Beispiel nur die “date” Spalte:

date
2023-01-01

Zusätzlich gibt es ein weiteres Blatt in dem die Coaches gespeichert werden. Hier ist nun entscheidend, dass definiert wird, wie von potentiell mehreren “Trainings” das richtige Element gewählt wird. In diesem Fall bedeutet dies, dass das “date” eindeutig sein muss TODO: In welchem Scope gilt diese Eindeutigkeit? Können wir dies checken? Das zweite Blatt sieht dann wie folgt aus

date coach.family_name coach.given_name
2023-01-01 Sky Max
2023-01-01 Sky Min