{# Macro für schöne JSON-Darstellung - kompakt und lesbar #} {% macro renderJsonValue(key, value, level) %} {% if value is iterable and value is not same as('') and value is not same as([]) %} {# Array oder Objekt #} {% set valueKeys = value|keys %} {% set isNumericArray = false %} {% if valueKeys|length > 0 %} {% set firstKey = valueKeys|first %} {% if firstKey is not iterable and firstKey is not same as('') and firstKey matches '/^\\d+$/' %} {% set isNumericArray = true %} {% endif %} {% endif %} {% if isNumericArray %} {# Numerisches Array - prüfe ob Elemente Objekte sind #} {% set hasObjectItems = false %} {% if value|length > 0 %} {% set firstItem = value|first %} {% if firstItem is iterable and firstItem is not same as('') and firstItem is not same as([]) and (firstItem|keys|length > 0) %} {% set hasObjectItems = true %} {% endif %} {% endif %} {% if hasObjectItems %} {# Array von Objekten - zeige als verschachtelte Liste #}
{% if key is not iterable %}{{ key|replace({'_': ' '})|title }}{% else %}{{ key|json_encode }}{% endif %} ({{ value|length }} Einträge)
{% for index, item in value %}
#{{ index + 1 }} {% if item is iterable and item is not same as('') and item is not same as([]) %} {% for subKey, subValue in item %} {{ _self.renderJsonValue(subKey, subValue, 1) }} {% endfor %} {% else %} {{ item }} {% endif %}
{% endfor %}
{% else %} {# Array von einfachen Werten - zeige als kompakte Liste #}
{% if key is not iterable %}{{ key|replace({'_': ' '})|title }}{% else %}{{ key|json_encode }}{% endif %}
{% for item in value %} {% if item is iterable and item is not same as('') and item is not same as([]) %} {{ item|json_encode }} {% else %} {{ item }} {% endif %} {% endfor %}
{% endif %} {% else %} {# Assoziatives Array/Objekt - flach darstellen wenn nur einfache Werte enthalten #} {% set hasNestedObjects = false %} {% for subValue in value %} {% if subValue is iterable and subValue is not same as('') and subValue is not same as([]) %} {% set hasNestedObjects = true %} {% endif %} {% endfor %} {% if hasNestedObjects or level > 0 %} {# Verschachteltes Objekt mit Unterobjekten - zeige mit Ordner #}
{% if key is not iterable %}{{ key|replace({'_': ' '})|title }}{% else %}{{ key|json_encode }}{% endif %}
{% for subKey, subValue in value %} {{ _self.renderJsonValue(subKey, subValue, level + 1) }} {% endfor %}
{% else %} {# Flaches Objekt - zeige alle Felder direkt #} {% for subKey, subValue in value %} {{ _self.renderJsonValue(subKey, subValue, level) }} {% endfor %} {% endif %} {% endif %} {% elseif value is same as(true) %}
{% if key is not iterable %}{{ key|replace({'_': ' '})|title }}{% else %}{{ key|json_encode }}{% endif %} Ja
{% elseif value is same as(false) %}
{% if key is not iterable %}{{ key|replace({'_': ' '})|title }}{% else %}{{ key|json_encode }}{% endif %} Nein
{% elseif value is null %}
{% if key is not iterable %}{{ key|replace({'_': ' '})|title }}{% else %}{{ key|json_encode }}{% endif %} -
{% elseif value is not iterable and value is not null and value is not same as('') and value matches '/^\\d{4}-\\d{2}-\\d{2}T/' %} {# ISO Datum/Zeit #}
{% if key is not iterable %}{{ key|replace({'_': ' '})|title }}{% else %}{{ key|json_encode }}{% endif %} {{ value|date('d.m.Y H:i:s') }}
{% elseif value is not iterable and value is not null and value is not same as('') and value matches '/^-?\\d+(\\.\\d+)?$/' %} {# Zahl - prüfe ob es ein Timestamp sein könnte (sehr große Zahl) #} {% if value|abs > 1000000000 and value|abs < 9999999999 %} {# Wahrscheinlich ein Unix-Timestamp #}
{% if key is not iterable %}{{ key|replace({'_': ' '})|title }}{% else %}{{ key|json_encode }}{% endif %} {{ value|round|date('d.m.Y H:i:s') }}
{% else %} {# Normale Zahl #}
{% if key is not iterable %}{{ key|replace({'_': ' '})|title }}{% else %}{{ key|json_encode }}{% endif %} {{ value }}
{% endif %} {% elseif value is not iterable or value is same as('') %} {# String oder einfacher Wert #}
{% if key is not iterable %}{{ key|replace({'_': ' '})|title }}{% else %}{{ key|json_encode }}{% endif %} {% if key is not iterable and key matches '/.*(ip|address|url|uri).*/i' %} {% elseif key is not iterable and key matches '/.*(signal|strength|quality).*/i' %} {% elseif key is not iterable and key matches '/.*(operator|network|type).*/i' %} {% elseif key is not iterable and key matches '/.*(timestamp|time|date).*/i' %} {% elseif key is not iterable and key matches '/.*(connected|status|state).*/i' %} {% else %} {% endif %} {% if value is iterable and value is not same as('') and value is not same as([]) %} {{ value|json_encode }} {% else %} {{ value }} {% endif %}
{% else %} {# Fallback für unerwartete Typen - zeige als JSON #}
{% if key is not iterable %}{{ key|replace({'_': ' '})|title }}{% else %}{{ key|json_encode }}{% endif %} {{ value|json_encode }}
{% endif %} {% endmacro %} {# Haupt-Macro für JSON-Anzeige - kompakt und vertikal #} {% macro displayJson(data, title) %}
{% if data is iterable and data is not same as([]) %} {% for key, value in data %} {% if key != 'error' %} {% set keyString = key is iterable ? key|json_encode : (key ?? 'unknown') %} {{ _self.renderJsonValue(keyString, value, 0) }} {% endif %} {% endfor %} {% else %}
{% if data is iterable and data is not same as('') and data is not same as([]) %} {{ data|json_encode }} {% else %} {{ data }} {% endif %}
{% endif %}
{% endmacro %}