Feldarten

JSON

Feldart json. Eine Liste von Einträgen, jeder mit einem Label und denselben Unterfeldern. Die Eingabe aus Sicht der Erfassung beschreibt JSON .

JSON-Feld Maßsatz in Moliri als Tabelle mit den Spalten Bereich, Höhe, Breite, Tiefe und Bemerkung, je eine Zeile für Objekt und Sockel

Das Modell

Ein JSON-Feld hat Unterfelder (fields, die Spalten) und optional Labels (labels, die Einträge). view entscheidet nur über die Darstellung als Reiter oder Tabelle; ein Umstellen bewegt keine Daten.

JSON
{
  "view": "tabs",
  "labels": ["Objekt", "Rahmen"],
  "creatable": true,
  "max": 1,
  "fields": [
    { "key": "hoehe",  "label": "Höhe",   "type": "number" },
    { "key": "breite", "label": "Breite", "type": "number" },
    { "key": "tiefe",  "label": "Tiefe",  "type": "number" }
  ]
}

Parameter

SchlüsselWerteOhne AngabeWirkung
viewtabs, tablekeineDarstellung. Ohne diesen Schlüssel zeigt das Feld „keine Felder konfiguriert“
labelsListe von ZeichenkettenleerDie verfügbaren Einträge. Fehlt die Liste und ist creatable aus, gibt es keine Label-Ebene
creatabletrue, falsefalseEigene Labels anlegen, umbenennen, entfernen
show_alltrue, falsetrueZeigt alle konfigurierten Labels, auch leere. false: nur befüllte, die übrigen über das Plus
maxZahl oder null1Einträge je Label. null heißt beliebig viele
fieldsListeleerDie Unterfelder, für alle Labels gleich
outputObjekt oder ListeleerAusgabe-Formatter, siehe unten

Das Label ist zugleich der Schlüssel im gespeicherten Wert. Wer ein Label in der Konfiguration umbenennt, lässt die alten Daten unter dem alten Label liegen. Sie bleiben sichtbar und werden als nicht konfiguriert markiert; der Umzug ist Handarbeit.

Unterfelder

SchlüsselOhne AngabeBedeutung
keySchlüssel im gespeicherten Wert
labelwie keyBeschriftung bzw. Spaltenkopf
typetexttext, multiline, number, date, select, switch, reference. Ein unbekannter Typ wird text
valuesleernur select: angebotene Werte
freefalsenur select: Freitext mit Vorschlägen statt fester Liste
librarykeinenur reference: normdata, address oder object, siehe Verweise
target_project_iddas Projekt des Feldesnur reference auf object: aus diesem Projekt wird gewählt
label_fieldkeinsnur reference auf object: Feldname des Titels im Zielprojekt
object_typesallenur reference auf object: erlaubte Objektarten als Liste oder kommagetrennt
widthautomatischBreite der Tabellenspalte, etwa 6rem
requiredfalseLeer erzeugt einen Hinweis. Sperrt nie
placeholderleerPlatzhaltertext

Kurzform: "fields": ["hoehe", "breite"] ergibt Textfelder mit Schlüssel gleich Beschriftung.

Ein date-Unterfeld zeigt die Datumsauswahl, solange der Wert leer oder ISO ist; ein bestehendes 14.02.2026 bleibt ein Textfeld. Ein select-Wert außerhalb der Liste wird ergänzt statt verworfen.

Verweise

Eine Spalte vom Typ reference zeigt auf einen Eintrag einer Bibliothek. Gespeichert wird nur dessen Kennung, nie die Beschriftung; die liest Moliri beim Anzeigen nach.

libraryZielGespeichertAuswahl
normdataein Normdatensatzdie Normdaten-ID, eine Ganzzahlwie im Normdatenfeld
addresseine Person im Adressbuchdie Personen-ID, eine Zeichenkette bis 36 Zeichenwie im Adressfeld
objectein Objektdie Objekt-ID, eine Ganzzahlwie im Objektfeld , das bearbeitete Objekt fällt heraus

Objektverweise kennen drei weitere Spaltenoptionen, benannt wie beim Objektfeld:

SchlüsselOhne AngabeWirkung
target_project_iddas Projekt des FeldesAus diesem Projekt wird gewählt
label_fieldkeinsSein Wert steht in der Zelle vor Projekt und Inventarnummer und wird in der Auswahl durchsucht
object_typesalleNur Objekte dieser Objektarten stehen zur Wahl, etwa ["literatur"]. Klein geschrieben

Ein Beispiel: Leihverkehr mit Leihgeber und Leihvertrag je Station.

JSON
{
  "view": "table",
  "max": null,
  "fields": [
    { "key": "station",   "label": "Station",    "type": "text" },
    { "key": "leihgeber", "label": "Leihgeber",  "type": "reference", "library": "address" },
    { "key": "ort",       "label": "Ort",        "type": "reference", "library": "normdata" },
    { "key": "vertrag",   "label": "Leihvertrag", "type": "reference", "library": "object",
      "target_project_id": 7, "label_field": "Titel", "object_types": ["vertrag"] }
  ]
}

Gespeichert ist dann etwa [{"station": "Berlin", "leihgeber": "a3f9…", "ort": "1204", "vertrag": "8812"}]. Fehlt library oder ist sie unbekannt, zeigt die Zelle die gespeicherte Kennung als Text und bietet keine Auswahl an. Passt eine Kennung nicht zur Bibliothek, etwa Buchstaben bei normdata, trägt die Zelle den Hinweis ID passt nicht zur Bibliothek. Ohne Leserecht am Ziel oder wenn es gelöscht ist, steht statt der Beschriftung die Kennung da.

Ein Verweis im JSON-Feld ist keine Verknüpfung : Er hat kein Gegenstück am Ziel, und das Ziel weiß nichts von ihm. Er passt für Angaben, die zu einem Eintrag gehören, etwa den Bearbeiter einer Bewegung. Was eine eigene Aussage über das Objekt ist, wird eine Verknüpfung oder ein Objektfeld .

Im Export bleibt der Verweis die Kennung. Ein Ausgabe-Formatter findet im Excel-Export und im Export nach einem Standard in zeilen zusätzlich die Beschriftung eines Objektverweises unter ⟨Schlüssel⟩~label, im Beispiel vertrag~label. Normdaten- und Adressverweise bleiben dort Kennungen.

Was gespeichert wird

Die Form klappt zusammen, sobald die Konfiguration das erlaubt:

KonfigurationGespeichertZugriff
Labels, max: 1, ein Unterfeld{"de": "Bildnis einer Dame"}Titel.de
Labels, max: 1, mehrere{"Objekt": {"hoehe": "118,5", "breite": "64"}}Maße.Objekt.breite
Labels, max größer 1 oder null{"Objekt": [{…}, {…}]}Maße.Objekt[0].breite
ohne Labels, ein Unterfeld["INV 2019/0412", "INV 2019/0413"]Inv[0]
ohne Labels, mehrere[{"hoehe": "118,5"}, …]Inv[0].hoehe

Wer max oder die Zahl der Unterfelder ändert, schreibt ab dann eine andere Form, als die vorhandenen Daten haben. Gelesen wird jede Form. Eingaben werden als Zeichenketten geschrieben ("1" statt 1), weil 118,5 ohnehin keine JSON-Zahl ist. Ein nie befülltes Feld ist eine leere Zeichenkette und gilt überall als leer. Unterfeld-Schlüssel, die die Konfiguration nicht kennt, bleiben erhalten.

Ausgabe-Formatter

Ein output-Block macht im Export die Variante „Formatiert“ verfügbar, in Galerie, Tabelle und Kanban ebenso. Er hat zwei Rümpfe:

JSON
{
  "output": {
    "entry": { "js": "return sub['hoehe'] + ' × ' + sub['breite'] + ' cm';" },
    "total": { "js": "return verbinde(zeilen, '{__label}: {formatiert}', '; ');" },
    "label": "Maße kurz"
  }
}

entry formatiert einen Eintrag (118,5 × 64 cm), total das ganze Feld (Objekt: 118,5 × 64 cm; Rahmen: 130 × 75 cm). Fehlt total, werden die Eintragsergebnisse mit ; verbunden. label beschriftet die Formatierung in Auswahl und Spaltenkopf.

Mehrere Formatierungen stehen als Liste mit je einer Kennung name. Die Variante standard ist die, die der schlichte Feldname adressiert; die übrigen heißen in Vorlagen Maße#kurz.

Name im Rumpfim entry-Rumpfim total-Rumpf
wertdas Label des Eintragsder Rohwert des Feldes
subdie Werte des Eintragsdie Unterfelder des Feldes
zeilendieser Eintrag als Listealle Einträge, jeder zusätzlich mit formatiert und __label
cfg('key')die eigene Konfigurationdieselbe
meta('key')Anmerkungen des Datenfeldes: Quelle, Kommentar, Farbe, unsicher, Modifierdieselbe
leer, spalte, verbinde, tab, maskeHilfendieselben

Ein Formatter sieht nur sein eigenes Feld. Wer über mehrere Felder rechnet, nimmt ein virtuelles Feld ; es kann über fmt('Maße') den fertigen Formatter eines JSON-Feldes abrufen.

Die Feldart selbst bringt die Formatierung Einträge einzeilig mit. Wie Vorgaben der Feldart und eigene Formatierungen zusammenwirken und welcher Sprachumfang im Rumpf erlaubt ist, steht unter Formatierungen .

Standards und Import

Ein JSON-Feld kann ein wiederholbares Konzept eines Metadaten-Standards bedienen, je Eintrag eine Instanz. Die Pseudospalte __label bindet dabei die Sprache eines Titels oder den Bezug eines Maßes. Siehe Metadaten-Standards .

Beim Excel-Import nimmt ein JSON-Feld ein vollständiges Dokument an, einen Wert unter einem gewählten Label, Spalten auf einzelne Schlüssel eines Eintrags oder Klartext, den der Bereinigungsschritt Text in JSON umformen umformt. Alles andere wird geparkt. Siehe JSON-Ziele . Zwei Parameter steuern den Import:

Parameter (im Formular)SchlüsselOhne AngabeWirkung
Label beim Importimport_labelkeineLabel, das der Excel-Import an jeder Spalte auf dieses Feld vorwählt, etwa de. Auch Zuordnungen auflösen schlägt es vor, wenn ein Text einem Schlüssel zugewiesen wird. Ergänzen prüft dann nur, ob unter diesem Label schon etwas steht
Beim Import anhängenimport.appendtrueStartwert des Schalters Anhängen an Schlüssel-Spalten: true hängt je Zeile einen neuen Eintrag an, false ersetzt die vorhandenen Einträge (unter dem Label). Nur bei mehreren Einträgen je Label

Von Text auf JSON umstellen

Text und JSON speichern ihre Werte gleich, ein Textfeld lässt sich deshalb auf JSON umstellen. Die Werte bleiben dabei Klartext, und das Feld zeigt sie als Rohinhalt. Der Bereinigungsschritt Text in JSON umformen teilt solchen Text an einem Trennzeichen auf und füllt die Schlüssel der Reihe nach; die Schlüssel sind mit den Spalten des Feldes vorbelegt. Über Bestand bereinigen in den Felddetails wird der ganze Bestand erst probeweise, dann wirklich umgeformt. Mit dem Schritt in der Kette nimmt auch der Excel-Import Klartext an, statt ihn zu parken. Siehe Bereinigung .

Beispiele

Dreisprachiger Titel:

JSON
{
  "view": "tabs",
  "labels": ["de", "en", "es"],
  "creatable": true,
  "max": 1,
  "fields": [{ "key": "titel", "label": "Titel", "type": "text" }],
  "output": {
    "total": { "js": "return verbinde(zeilen, '{__label}: {titel}', '; ');" },
    "label": "Alle Sprachen"
  }
}

Maße mit Bezug, wiederholbar:

JSON
{
  "view": "table",
  "labels": ["Objekt", "Rahmen", "Passepartout"],
  "creatable": true,
  "show_all": false,
  "max": null,
  "fields": [
    { "key": "art", "label": "Art", "type": "select", "free": true,
      "values": ["Höhe", "Breite", "Tiefe", "Gewicht"], "width": "7rem" },
    { "key": "wert", "label": "Wert", "type": "number", "required": true, "width": "5rem" },
    { "key": "einheit", "label": "Einheit", "type": "select", "free": true,
      "values": ["cm", "mm", "m", "g", "kg"], "width": "4.5rem" }
  ],
  "output": {
    "entry": { "js": "return sub['art'] + ' ' + sub['wert'] + ' ' + sub['einheit'];" },
    "total": { "js": "return verbinde(zeilen, '{__label}: {formatiert}', '; ');" }
  }
}

Inventarnummern ohne Label:

JSON
{ "view": "table", "max": null, "fields": [{ "key": "nr", "label": "Nummer" }] }

Wann eine andere Feldart passt

Sobald nach einem der Werte gesucht, sortiert oder gruppiert wird, gehört er in ein eigenes Feld. Für ein Konstrukt, das keine Liste gleichförmiger Einträge ist, gibt es JSON-Schema . Für einen einzelnen Wert lohnt die Struktur nicht.