JSON Dotted Key Transformer (mmjsontransform)¶
Module Name: |
mmjsontransform |
Author: |
|
Available since: |
8.2410.0 |
Note
mmjsontransform
is a fresh module. Parameter names and behavior may
still change as real-world feedback arrives, so expect possible breaking
adjustments in upcoming releases.
Purpose¶
mmjsontransform
restructures JSON properties whose names contain dotted
segments. The action reads a JSON object from the configured input property and
stores the transformed tree under a dedicated output property. By default the
module expands dotted keys into nested containers (unflatten
mode) so
pipelines that consume option.jsonfTree
data can normalize payloads inline.
When mode="flatten"
is selected, the action collapses nested objects back
into dotted keys.
Failure conditions¶
mmjsontransform
aborts the action when any of the following occur:
The input property does not resolve to a JSON object.
The output property already exists on the message.
Rewriting a key would overwrite an existing incompatible value (for example,
{"a": 1}
combined with{"a.b": 2}
).
Notable Features¶
Transformation modes — bidirectional conversion between dotted keys and nested containers.
Conflict handling — detailed conflict reporting to locate incompatible payloads quickly.
Configuration Parameters¶
Note
Parameter names are case-insensitive. For readability, camelCase is recommended.
Action Parameters¶
Transformation modes¶
mmjsontransform
supports two modes controlled by the mode parameter. Both modes rewrite the entire input
object before assigning it to the configured output property.
Unflatten dotted keys¶
mode="unflatten"
(the default) expands dotted keys into nested containers.
For example {"a.b": 1, "a.c": 2}
becomes {"a": {"b": 1, "c": 2}}
.
When the module encounters a dotted path that points to an existing
non-object value, it stops processing, leaves the output unset, and reports the
conflicting path.
Flatten nested containers¶
mode="flatten"
performs the reverse operation. Nested objects become dotted
key paths ({"nested": {"value": 1}}
is rewritten to
{"nested.value": 1}
), while arrays are preserved with their elements
recursively flattened. If flattening would overwrite an existing scalar with a
different value, the action fails and reports the mismatch.
Conflict handling¶
The module tracks the full dotted path responsible for a hierarchy conflict and logs a user-facing error when a mismatch occurs. Review the reported path to identify which input property must be renamed or preprocessed before retrying the transformation.
Examples¶
Normalize and persist dotted JSON¶
The following snippet receives JSON payloads, normalizes dotted keys into
nested objects, and writes both the structured tree and a flattened
representation to /tmp/out.json
:
module(load="mmjsontransform")
module(load="imtcp")
input(type="imtcp" port="10514" ruleset="process-json")
ruleset(name="process-json") {
action(type="mmjsontransform" input="$!raw" output="$!normalized")
action(type="mmjsontransform" mode="flatten"
input="$!normalized" output="$!normalized_flat")
action(type="omfile" file="/tmp/out.json"
template="json-template")
}
template(name="json-template" type="string"
string="%$!normalized%\n%$!normalized_flat%\n")
Troubleshooting¶
When a hierarchy conflict occurs (for example, mode="unflatten"
sees
"a": "value"
and "a.b": 1
), mmjsontransform
logs an error that
includes the conflicting path. Inspect the reported path to determine which
input property needs to be renamed or moved before retrying the transformation.
Support: rsyslog Assistant | GitHub Discussions | GitHub Issues: rsyslog source project
Contributing: Source & docs: rsyslog source project
© 2008–2025 Rainer Gerhards and others. Licensed under the Apache License 2.0.