All nodes/Data/JSON

JSON Merge

Merges two JSON objects: keys from B override keys from A. Supports deep (recursive) merge and shallow merge. Handy for combining data from different nodes.

JSON Merge
InputResult
Base
Override

Type in the graph: json_merge

Exec

An error branch can be enabled (expose_error_output) to handle failures on their own path.

Ports can be split into separate execution and data handles.

Try it

Minimal working workflow

Entry
JSON Merge
Exit
  • Execute + Data
Press “Copy nodes”, open the editor and hit Ctrl+V on the canvas.

Runs as pasted

When to use it

The node builds one object out of two: an external service’s response plus your own fields, a set of defaults plus user overrides, the results of two parallel branches folded into one payload. When there is only a single field to change, JSON Set is simpler.

Do not confuse it with the Merge node: that one is about wires — it folds a separate execution edge and a data edge into one. This one is only about the contents of objects.

How it works

“Base” is the foundation, “Override” is what wins: on a key collision the value from “Override” is kept. When “Base” is unconnected, whatever arrived on the “Input” port becomes the base, so the object can travel along the main chain.

“Deep merge” is on by default: nested objects are merged recursively, so {"user": {"name": "…"}} applied over {"user": {"id": 7}} keeps both id and name. Turned off, a top-level field is replaced wholesale — user becomes exactly what arrived on “Override”.

Common mistakes

  • “Override” is required. The base has a fallback through “Input”, the override does not: merging with nothing means the author forgot a wire, and the node says so instead of returning the base unchanged.
  • Arrays are not concatenated. A list from “Override” replaces the list from “Base” entirely, at any nesting depth. To append to an array you need JavaScript Code.
  • A non-object input becomes an empty object. A list or a string arriving on “Base” disappears without an error, and the result is just the override.
  • The two sides are not symmetric. Swapping “Base” and “Override” produces a different answer, and it looks like the node lost your data.

Inputs

PortWirePayloadNotes
InputinputExecute + Dataexecute_data

Run trigger; its payload is used as the base object when the Base port is not connected.

BaseaDatadata

Base object

OverridebDatadata

Keys from B override A

Outputs

PortWirePayloadNotes
ResultoutputExecute + Dataexecute_dataobject

Configuration

FieldTypeDefaultDescription
Deep mergedeepbooleantrue

Recursively merge nested objects (off = shallow override)

Shared fields

Every node has these three — the platform adds them, not the node author.

  • expose_error_output — When enabled, show an execution output to connect nodes that run if this step fails.
  • split_ports_in — Show separate execution and data input handles instead of one combined port.
  • split_ports_out — Show separate execution and data output handles instead of one combined port.