All Products
Search
Document Center

Security Center:DataFormat component

Last Updated:Mar 31, 2026

The DataFormat component provides data processing actions for Security Orchestration, Automation and Response (SOAR) playbooks, including joining, grouping, concatenating, and transforming data.

Actions

Each action serves a distinct purpose. Use this table to pick the right action for your use case.

ActionWhat it doesUse whenSQL equivalent
joindataJoins multiple data nodes and outputs specified fieldsCombining two or more datasets where rows in both must matchINNER JOIN
leftJoinJoins two data nodes, keeping all rows from the left nodeCombining datasets where you need all left-side rows, even without a match on the rightLEFT JOIN
groupbydataGroups rows by a key and computes aggregationsSummarizing data — for example, counting events by attack typeGROUP BY
concatFieldtoBatchConcatenates field values in batches into stringsMerging array values into delimited strings with optional prefix/suffix
convertToJsonConverts a string to a JSONArray or JSONObjectPreparing string data for downstream actions that require JSON inputCAST / CONVERT
uniondataCombines rows from multiple data nodes into one datasetMerging results from parallel branches into a single listUNION ALL
formatdataCreates a new data row with specified field-value pairsGenerating structured output from static or upstream valuesSELECT ... AS
Save the sample JSON data as a file before importing examples as test playbooks. To learn how to import a playbook, see Import a playbook.

Component configuration examples

The following sections cover the configuration details and sample inputs and outputs for each action.

joindata

Joins multiple data nodes on a shared key and outputs specified fields. This is an inner join — only rows that match in all input nodes appear in the output.

Parameters

ParameterDescription
inputNodesThe data nodes to join. Each node's data must be a JSONArray. There is no limit on nesting depth — a JSONArray can contain nested JSONArrays.
joinFieldsThe fields to join on. Format: [nodeName].[fieldName]. Only first-level fields are supported. JSONArray and String field types are both accepted. Nested fields (for example, uuid-key inside uuid) cannot be used as join keys.
outputFieldsThe fields to include in the output. Format: [nodeName].[fieldName].
When referencing a node in inputNodes, prefix the value with JSONArray: to ensure the data is treated as a JSONArray. Without this prefix, data cannot be read from the upstream node.

Example

Input data:

  • leftJSON: [{"action":"11","uuid":[{"uuid-key":"1"}]},{"action":"21","uuid":[{"uuid-key":"2"}]}]

  • rightJSON: [{"uuid":[{"uuid-key":"1"}],"host":"196.1.*.*"},{"uuid":[{"uuid-key":"1"}],"host":"196.2.*.*"}]

Parameter values:

ParameterConfiguration
inputNodesRow 1 — Left: leftJSON, Right: ${JSONArray:leftJSON.datalist.*}
Row 2 — Left: rightJSON, Right: ${JSONArray:rightJSON.datalist.*}
joinFieldsLeft: leftJSON.uuid, Right: rightJSON.uuid
outputFieldsRow 1 — Left: myhost, Right: rightJSON.host
Row 2 — Left: myaction, Right: leftJSON.action
Row 3 — Left: uuid, Right: leftJSON.uuid

Output:

[
    {
        "myaction": "11",
        "uuid": [{"uuid-key": "1"}],
        "myhost": "196.1.*.*"
    },
    {
        "myaction": "11",
        "uuid": [{"uuid-key": "1"}],
        "myhost": "196.2.*.*"
    }
]
The row with action: "21" does not appear in the output because no row in rightJSON has uuid-key: "2". Use leftJoin instead if you need to keep unmatched left-side rows.

leftJoin

Performs a left join using the left node as the primary table. All rows from the left node appear in the output. Rows from the right node that do not match are discarded; rows from the left node that do not match are included with empty values for right-node fields.

Parameters

ParameterDescription
leftNodeThe primary (left) data node. Format must be a JSONArray of JSON objects. Nested JSONArrays are supported.
rightNodeThe secondary (right) data node. Format must be a JSONArray of JSON objects. Nested JSONArrays are supported.
joinFieldsThe fields to join on. Format: leftNode.[fieldName] and rightNode.[fieldName]. Only first-level fields are supported — nested fields (for example, uuid-key inside uuid) cannot be used as join keys.
leftOutputFileldsFields to output from the left node, with optional key renaming. Left input: new name. Right input: original field name. Use * in the left box to keep the original name; use * in the right box to select all fields. Separate multiple fields with a comma.
rightOutputFieldsFields to output from the right node, with optional key renaming. Same convention as leftOutputFilelds.
Both leftNode and rightNode data must be converted to JSONArray type before use.

Example

Input data:

leftNode:

[
    {"action": "11", "uuid": [{"uuid-key": "1"}]},
    {"action": "21", "uuid": [{"uuid-key": "2"}]}
]

rightNode:

[
    {"uuid": [{"uuid-key": "1"}], "host": "196.1.*.*"},
    {"uuid": [{"uuid-key": "1"}], "host": "196.2.*.*"}
]

Parameter values:

ParameterConfiguration
joinFieldsLeft: leftNode.uuid, Right: rightNode.uuid
leftOutputFileldsLeft: *, Right: action,uuid
rightOutputFieldsLeft: site, Right: host

Output:

[
    {
        "action": "11",
        "uuid": [{"uuid-key": "1"}],
        "site": "196.1.*.*"
    },
    {
        "action": "11",
        "uuid": [{"uuid-key": "1"}],
        "site": "196.2.*.*"
    },
    {
        "action": "21",
        "uuid": [{"uuid-key": "2"}]
    }
]

The row with action: "21" is retained even though it has no matching row in rightNode. The site field is absent for that row.

groupbydata

Groups rows by a key and computes aggregated values for each group. Similar to a SQL GROUP BY statement — rows with the same key are grouped together, then an expression is applied to produce summary values.

Parameters

ParameterDescription
inputNodeThe data to group. Must be a JSONArray of JSON objects.
groupByKeysThe field to group by. Rows with the same value for this field are placed in the same group.
outputFieldsThe computed fields to include for each group. Supports jq expressions applied to the grouped data.

Example

Scenario: Group security events by Attack Type, then compute the total number of attacks and the most recent attack time.

Input data (`inputNode`):

[
    {"Attack Type": "web shell", "count": "1", "startTime": "1646115503000", "endTime": "1646115503000", "securityEventIds": "330706"},
    {"Attack Type": "web shell", "count": "2", "startTime": "1646114346000", "endTime": "1646114346000", "securityEventIds": "330700"},
    {"Attack Type": "application whitelist", "count": "1", "startTime": "1646114098000", "endTime": "1646114098000", "securityEventIds": "330699"}
]

Parameter values:

ParameterConfiguration
groupByKeysAttack Type
outputFields[{"fieldName":"Attack Count","fieldType":"jq","fieldValue":".datalist | map_values(.count)|add|length"},{"fieldName":"Latest Attack Time","fieldType":"jq","fieldValue":"[.datalist[].endTime|tonumber]|max"}]

The two jq expressions above:

  • .datalist | map_values(.count)|add|length — counts the total number of attack events in the group

  • [.datalist[].endTime|tonumber]|max — converts endTime values to numbers and returns the maximum (most recent time)

Output:

[
    {"Attack Type": "web shell", "Attack Count": 2, "Latest Attack Time": 1646115503000},
    {"Attack Type": "application whitelist", "Attack Count": 1, "Latest Attack Time": 1646114098000}
]

concatFieldtoBatch

Splits a JSONArray field into mini-batches and concatenates the values in each batch into a string. Supports custom separators, prefixes, and suffixes.

Parameters

ParameterDescription
inputFieldThe data to concatenate. Must be a JSONArray of JSON objects.
batchSizeNumber of items per batch. For example, 2 groups two objects together. Use -1 to combine all objects into one string.
concatStrThe separator inserted between concatenated values. Enclose in double quotation marks to preserve spaces — for example, " ## ".
fieldAddPrefixA prefix added to the start of each concatenated string.
fieldAddSuffixA suffix added to the end of each concatenated string.

Example

Scenario: Concatenate Attack Type values in groups of two, using " ## " as the separator, with prefix Prefix and suffix Suffix.

Input data (`inputField`):

[
    {"Attack Type": "web shell"},
    {"Attack Type": "web shell"},
    {"Attack Type": "web shell"},
    {"Attack Type": "application whitelist"},
    {"Attack Type": "application whitelist"}
]

Parameter values:

ParameterValue
batchSize2
concatStr" ## "
fieldAddPrefixPrefix
fieldAddSuffixSuffix

Output:

[
    {"concatField": "PrefixWebShellSuffix ## PrefixWebShellSuffix"},
    {"concatField": "PrefixWebShellSuffix ## PrefixApplicationWhitelistSuffix"},
    {"concatField": "PrefixApplicationWhitelistSuffix"}
]

The five input items are split into batches of two (groups 1 and 2) plus one remaining item (group 3).

convertToJson

Converts a string to a JSON object. This action only performs type conversion — it does not modify the data.

  • If the input is a JSONArray string, all elements are placed directly into the datalist.

  • If the input is a JSONObject string, it is treated as a single row in the datalist.

This action is typically used to prepare upstream string data before passing it to actions such as joindata, leftJoin, or groupbydata, which require JSONArray input.

uniondata

Combines rows from multiple upstream data nodes into a single dataset. All rows from all specified nodes are included — equivalent to a SQL UNION ALL.

Parameters

ParameterDescription
inputNodesThe node data to combine.
The left input box labels (for example, leftJSON, rightJSON) are identifiers only and have no effect on the output. Prefix each right-box value with JSONArray: to ensure the data is read correctly from upstream nodes.

Example

Input data:

  • left: [{"action":"11","uuid":[{"uuid-key":"1"}]},{"action":"21","uuid":[{"uuid-key":"2"}]}]

  • right: [{"uuid":[{"uuid-key":"1"}],"host":"196.1.*.*"},{"uuid":[{"uuid-key":"1"}],"host":"196.2.*.*"}]

Parameter values:

ParameterConfiguration
inputNodesRow 1 — Left: leftJSON, Right: ${JSONArray:left.datalist.*}
Row 2 — Left: rightJSON, Right: ${JSONArray:right.datalist.*}

Output:

[
    {"action": "11", "uuid": [{"uuid-key": "1"}]},
    {"action": "21", "uuid": [{"uuid-key": "2"}]},
    {"uuid": [{"uuid-key": "1"}], "host": "196.1.*.*"},
    {"uuid": [{"uuid-key": "1"}], "host": "196.2.*.*"}
]

formatdata

Transforms data and aggregates data from multiple sources into a new table. Use this action to create structured output with explicitly defined field-value pairs from static values or upstream node references.

Parameters

ParameterDescription
outputFieldsThe field-value pairs to include in the output. Left input: field name. Right input: field value.

Example

Parameter values:

Left (field name)Right (field value)
nametest
age18

Output:

{
    "name": "test",
    "age": "18"
}