JSON-Standard Dokumentation
Fabian Suda
Senior Developer
Diese Seite beschreibt den grundsätzlichen Aufbau sowie die Struktur eines bim-t-Standards im JSON-Format. Ziel ist es, transparent darzustellen, wie ein solcher Standard logisch gegliedert ist und welche Elemente er enthält, um eine einheitliche und nachvollziehbare Nutzung zu ermöglichen.
Die hier beschriebenen JSON-Strukturen dienen als technische Grundlage zur Abbildung von Standards innerhalb der bim-t-Umgebung. Auf Basis dieser Definitionen können strukturierte Dateien erstellt werden, die alle relevanten Informationen in maschinenlesbarer Form enthalten. Dadurch wird sichergestellt, dass Inhalte konsistent, erweiterbar und systemübergreifend nutzbar sind.
Die erstellten JSON-Dateien können anschließend direkt in die entsprechende Applikation importiert werden. Dort werden sie weiterverarbeitet und bilden die Basis für standardisierte Abläufe, Auswertungen oder Konfigurationen. Durch diesen Ansatz lassen sich Standards flexibel pflegen, versionieren und bei Bedarf an neue Anforderungen anpassen.
Der Artikel richtet sich sowohl an technisch versierte Anwender:innen als auch an Personen, die ein grundlegendes Verständnis für die Funktionsweise und den Nutzen der JSON-basierten Standards innerhalb von bim-t gewinnen möchten.
Sie können den Beispiel-Standard im JSON-Format hier herunterladen und direkt in bim-t ausprobieren:
StandardExport_ExportstrukturStandard.jsonGrundstruktur
Hinweis: Inhalte im Feld
descriptionwerden als Markdown interpretiert. Eine Übersicht der unterstützten Formatierungen finden Sie hier: Markdown-Format
{
"standards": [
{
"id": "urn:uuid:temp__std1",
"name": "Exportstruktur Standard",
"version": "1.4.5",
"description": "Beschreibung im Markdown Format\n\n# Überschrift 1\n## Überschrift 2\n\n*italic*\n**bold**\n\n> Zitat\n\n`codesimple`\n\n```\ncodeblock\n```\n\n[bim-t link](https://bim-t.com)\n\n- bullet1\n- bullet2\n- bullet3\n\n1. numlist\n2. numlist\n3. numlist\n\n- [ ] task1\n- [ ] task2\n- [x] task3(done)\n\n### Mathematische Formeln:\n[dokumentation/cheatsheet](https://www.upyesp.org/posts/makrdown-vscode-math-notation/)\n\n**The Cauchy-Schwarz Inequality**\n$$\left( \sum_{k=1}^n a_k b_k \right)^2 \leq \left( \sum_{k=1}^n a_k^2 \right) \left( \sum_{k=1}^n b_k^2 \right)$$\n\n**Summenbeispiel zentriert**\n$$\n\displaystyle\sum_{k=3}^5 k^2=3^2 + 4^2 + 5^2 =50\n$$",
"features": [],
"propertySets": [],
"classificationSchemas": []
}
]
}
Attribute:
description: Beschreibung im Markdown-Format (optional)version: Versionsangabe nach SemVer (MAJOR.MINOR.PATCH) (optional)features: Array der FeaturespropertySets: Array der PropertySetsclassificationSchemas: Array der ClassificationSchemas
PropertySet
Beispiel eines PropertySets
{
"id": "urn:uuid:temp__ps_custom",
"name": "BimTSet_Custom",
"description": "markdown beschreibung optional"
}
Feature (Merkmal)
Ein Feature beschreibt ein einzelnes Merkmal inklusive Datentyp und optionaler Zusatzinformationen.
Beispiel eines Textmerkmals
{
"id": "urn:uuid:temp__f_text",
"name": "TextMerkmal",
"description": "",
"type": {
"__typename": "StringType"
},
"instanceValues": []
}
type: Es gibt folgende Typen, die in __typename definiert sein können:
BooleanType: Boolescher Wert (IFCBOOLEAN)DateTimeType: ISO 8601 Date+TimeDateType: ISO 8601 DateDurationType: ISO 8601 Duration StringsLogicalType: Logischer Wert Ja / Nein / Unbekannt (IFCLOGICAL)ReferenceType: Auch ein Textmerkmal generiert, aberIFCREFERENCEStringType: Textmerkmal (generiertIFCLABELoderIFCTEXT, abhängig der Länge des Textes)TimeStampType: Zeitstempel (IFCTIMESTAMP)TimeType: ISO 8601 TimeYearMonthType: ISO 8601 Date (Aber nur mit Jahres-/MonatsangabeYYYY-MM)YearType: ISO 8601 Date (Aber nur mit JahresangabeYYYY)EnumerationType: Enumerationsmerkmal (derzeit nur mit String-Werten), für Textmerkmale, die grundsätzlich nur bestimmte Ausprägungen haben dürfenNumericType: Numerisches Merkmal (siehe Beschreibung unten)OtherType: Derzeit verwendet für alle Merkmale, die von bim-t noch nicht unterstützt werden. (z.B.IFCBINARY)
Enumerationsmerkmal
Beispiel eines Enumerationsmerkmals mit drei Werten und ohne Mehrfachauswahl
{
"id": "urn:uuid:temp__f_enum",
"name": "Enumeration",
"description": "",
"type": {
"id": "urn:uuid:temp_f_enumtype1",
"__typename": "EnumerationType",
"options": [
{
"id": "urn:uuid:temp__f_enum_val1",
"value": {
"__typename": "StringValue",
"stringValue": "Wert1"
},
"description": "Beschreibung Wert1"
},
{
"id": "urn:uuid:temp__f_enum_val2",
"value": {
"__typename": "StringValue",
"stringValue": "Wert2"
},
"description": "Beschreibung Wert2"
},
{
"id": "urn:uuid:temp__f_enum_val3",
"value": {
"__typename": "StringValue",
"stringValue": "Wert3"
},
"description": "Beschreibung Wert3"
}
],
"allowMultiple": false
}
}
Numerische Merkmale
Numerische Merkmale haben die zusätzlichen Attribute quantityKind, unit, integer, signRestriction:
quantityKind: Messgrößeunit: Einheitinteger: Ganze Zahl (ja / nein)signRestriction: ZeichenbeschränkungUNRESTRICTEDNONZERONONZERO_POSITIVENONZERO_NEGATIVEZERO_OR_NEGATIVEZERO_OR_POSITIVE
Beispiel Zeit in Sekunden (ganzzahlig)
{
"id": "urn:uuid:temp__f_time",
"name": "ZeitInSekunden",
"description": "",
"type": {
"__typename": "NumericType",
"integer": true,
"signRestriction": "UNRESTRICTED",
"quantityKind": "http://qudt.org/vocab/quantitykind/Time",
"unit": "http://qudt.org/vocab/unit/SEC"
}
}
Beispiel Länge in Meter
{
"id": "urn:uuid:temp__f_length",
"name": "LaengeMeter",
"description": "",
"type": {
"__typename": "NumericType",
"integer": false,
"signRestriction": "UNRESTRICTED",
"quantityKind": "http://qudt.org/vocab/quantitykind/Length",
"unit": "http://qudt.org/vocab/unit/M"
}
}
Beispiel Positive Länge in Zentimeter
{
"id": "urn:uuid:temp__f4",
"name": "PosLaengeInCM",
"description": "",
"type": {
"__typename": "NumericType",
"integer": false,
"signRestriction": "NONZERO_POSITIVE",
"quantityKind": "http://qudt.org/vocab/quantitykind/PositiveLength",
"unit": "http://qudt.org/vocab/unit/CentiM"
}
}
Hinweis: Die in den Merkmalen verfügbaren Messgrößen und Einheiten können in der QUDT-Tabelle nachgelesen werden.
Klassifikationsschema
{
"id": "urn:uuid:temp_schema1",
"name": "TestSchema",
"ifcVersionName": "IFC 2x3 TC1",
"description": "Markdown fähig",
"criteria": [
{
"level": 0,
"accessor": {
"__typename": "SourceAsType",
"value": "ELEMENT_CLASS"
}
},
{
"level": 1,
"accessor": {
"__typename": "SourceAsType",
"value": "ELEMENT_PREDEFINEDTYPE"
}
},
{
"level": 2,
"accessor": {
"__typename": "SourceAsType",
"value": "ELEMENT_OBJECTTYPE"
}
},
{
"level": 3,
"accessor": {
"__typename": "FeatureAccessor",
"feature": {
"__typename": "Feature",
"id": "urn:uuid:temp__f_enum",
"name": "Enumeration"
},
"propertySet": {
"__typename": "IDValue",
"idValue": "urn:uuid:temp__ps_custom"
}
}
},
{
"level": 4,
"accessor": {
"__typename": "FeatureAccessor",
"feature": {
"__typename": "Feature",
"id": "urn:uuid:temp__f_text",
"name": "TextMerkmal"
},
"propertySet": null
}
}
],
"classifications": []
}
Beispiel Klassifikation Simpel
{
"id": "urn:uuid:temp__cl_1",
"name": "Klassifikation Simpel",
"description": "",
"requirements": [
{
"allowedValues": [
{
"__typename": "StringValue",
"stringValue": "xyz"
},
{
"__typename": "StringValue",
"stringValue": "123"
},
{
"__typename": "StringValue",
"stringValue": "abc"
}
],
"tags": [],
"feature": {
"id": "urn:uuid:temp__f_text",
"name": "TextMerkmal"
},
"optional": false,
"propertySet": {
"__typename": "IDValue",
"idValue": "urn:uuid:temp__ps_custom"
}
},
{
"allowedValues": [
{
"__typename": "FloatValue",
"floatValue": 1.5
},
{
"__typename": "FloatValue",
"floatValue": 4.2
}
],
"tags": [],
"feature": {
"id": "urn:uuid:temp__length",
"name": "LaengeMeter"
},
"optional": false,
"propertySet": {
"__typename": "IDValue",
"idValue": "urn:uuid:temp__ps_custom"
}
},
{
"allowedValues": [
{
"__typename": "IntegerValue",
"integerValue": 2
},
{
"__typename": "IntegerValue",
"integerValue": 3
},
{
"__typename": "IntegerValue",
"integerValue": 4
}
],
"tags": ["LOI100", "LOI200", "LOI300"],
"feature": {
"id": "urn:uuid:temp__f_time",
"name": "ZeitInSekunden"
},
"optional": true,
"propertySet": {
"__typename": "IDValue",
"idValue": "urn:uuid:temp__ps_custom"
}
},
{
"allowedValues": [
{
"__typename": "IDValue",
"idValue": "urn:uuid:temp__f_enum_val1"
},
{
"__typename": "IDValue",
"idValue": "urn:uuid:temp__f_enum_val2"
}
],
"tags": ["LOI100", "LOI200"],
"feature": {
"id": "urn:uuid:temp__f_enum",
"name": "Enumeration"
},
"optional": false,
"propertySet": {
"__typename": "IDValue",
"idValue": "urn:uuid:temp__ps_custom"
}
}
],
"condition": {
"__typename": "ConditionGroup",
"connective": "AND",
"conditions": [
{
"__typename": "ElementCondition",
"source": "ELEMENT_CLASS",
"predicate": "EQUALS",
"value": {
"__typename": "IDValue",
"idValue": "https://bim-t.com/bt-ifc#IfcElement"
}
},
{
"__typename": "SingleCondition",
"feature": {
"id": "urn:uuid:temp__f_text",
"name": "TextMerkmal"
},
"propertySet": null,
"predicate": "EQUALS",
"value": {
"__typename": "StringValue",
"stringValue": "test"
}
},
{
"__typename": "SingleCondition",
"feature": {
"id": "urn:uuid:temp__f_enum",
"name": "Enumeration"
},
"propertySet": {
"__typename": "IDValue",
"idValue": "urn:uuid:temp__ps_custom"
},
"predicate": "HAS",
"value": {
"__typename": "IDValue",
"idValue": "urn:uuid:temp__f_enum_val2"
}
}
]
}
}
Beispiel Klassifikation mit Bedingungen
{
"id": "urn:uuid:temp__cl_2",
"name": "Klassifikation mit Bedingungen",
"description": "",
"requirements": [
{
"condition": {
"__typename": "SingleCondition",
"feature": {
"id": "urn:uuid:temp__f_poslength",
"name": "PosLaengeInCM"
},
"propertySet": {
"__typename": "IDValue",
"idValue": "urn:uuid:temp__ps_custom"
},
"predicate": "GREATER_THAN",
"value": {
"__typename": "FloatValue",
"floatValue": 100
}
},
"allowedValues": [],
"tags": [],
"feature": {
"id": "urn:uuid:temp__f_poslength",
"name": "PosLaengeInCM"
},
"optional": false,
"propertySet": {
"__typename": "IDValue",
"idValue": "urn:uuid:temp__ps_custom"
}
},
{
"precondition": {
"__typename": "SingleCondition",
"feature": {
"id": "urn:uuid:temp__f_enum",
"name": "Enumeration"
},
"propertySet": {
"__typename": "IDValue",
"idValue": "urn:uuid:temp__ps_custom"
},
"predicate": "HAS",
"value": {
"__typename": "IDValue",
"idValue": "urn:uuid:temp__f_enum_val1"
}
},
"allowedValues": [],
"tags": [],
"feature": {
"id": "urn:uuid:temp__length",
"name": "LaengeMeter"
},
"optional": false,
"propertySet": {
"__typename": "IDValue",
"idValue": "urn:uuid:temp__ps_custom"
}
}
],
"condition": {
"__typename": "ConditionGroup",
"connective": "OR",
"conditions": [
{
"__typename": "ConditionGroup",
"connective": "AND",
"conditions": [
{
"__typename": "SingleCondition",
"feature": {
"id": "urn:uuid:temp__f_enum",
"name": "Enumeration"
},
"propertySet": {
"__typename": "IDValue",
"idValue": "urn:uuid:temp__ps_custom"
},
"predicate": "HAS",
"value": {
"__typename": "IDValue",
"idValue": "urn:uuid:temp__f_enum_val2"
}
},
{
"__typename": "ElementCondition",
"source": "ELEMENT_CLASS",
"predicate": "EQUALS",
"value": {
"__typename": "IDValue",
"idValue": "https://bim-t.com/bt-ifc#IfcSlab"
}
}
]
},
{
"__typename": "ConditionGroup",
"connective": "AND",
"conditions": [
{
"__typename": "SingleCondition",
"feature": {
"id": "urn:uuid:temp__f_enum",
"name": "Enumeration"
},
"propertySet": {
"__typename": "IDValue",
"idValue": "urn:uuid:temp__ps_custom"
},
"predicate": "HAS",
"value": {
"__typename": "IDValue",
"idValue": "urn:uuid:temp__f_enum_val1"
}
},
{
"__typename": "ElementCondition",
"source": "ELEMENT_CLASS",
"predicate": "EQUALS",
"value": {
"__typename": "IDValue",
"idValue": "https://bim-t.com/bt-ifc#IfcWall"
}
}
]
}
]
}
}
Regeln für Klassifikationsbedingungen
- Klassifikationsbedingungen dürfen derzeit nur Merkmale enthalten, die auch in den Kriterien
criteriades Klassifikationsschemas enthalten sind. - Dabei darf in jeder ConditionGroup ein definiertes Kriterium nur einmal vorkommen und mit einem
AND-connectiveverbunden werden. - Gibt es mehrere mögliche Bedingungen (siehe Beispiel), so müssen diese mit einer
ConditionGroupund demOR-connectiveverbunden werden. - Enumerationsmerkmale MÜSSEN mit dem Predicate
HASund einem idValue, der auf den Enum-Wert referenziert, verwendet werden. - Alle anderen Merkmale MÜSSEN mit dem Predicate
EQUALSund einem korrekten TypedValue angeführt werden, z.B.:- String- und Reference-Merkmale:
StringValue/stringValue - Boolesche Merkmale:
BooleanValue/booleanValue - weitere Typen entsprechend ihrer Definition
- String- und Reference-Merkmale:
Beschreibung für Requirements
precondition: Beliebige Bedingung, die gelten muss, damit diese Anforderung erforderlich ist (optional)condition: Beliebige Bedingung, die zusätzlich zum Merkmal erfüllt sein mussoptional: Definiert eine optionale Bedingung (ist das Merkmal nicht vorhanden, gilt die Anforderung als erfüllt; ist es vorhanden, muss es gültig sein)tags: String-Array, das z.B. die LOIs definiert, für die diese Anforderung gültig sein muss (ACHTUNG: Anforderungen OHNE Tags werden IMMER geprüft)
Beschreibung für SingleConditions
predicate:NOTEQUALS(bei Enumerationsmerkmalen stattdessenHASverwenden)CONTAINSCONTAINS_NOTMATCHES(JavaScript-RegEx)PRESENT(vorhanden)NOT_PRESENT(nicht vorhanden)HASHAS_NOTLESS_THANLESS_OR_EQUALSGREATER_THANGREATER_OR_EQUALS