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.
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
- Execute + Data
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
| Port | Wire | Payload | Notes |
|---|---|---|---|
Inputinput | Execute + Dataexecute_data | — | Run trigger; its payload is used as the base object when the Base port is not connected. |
Basea | Datadata | — | Base object |
Overrideb | Datadata | — | Keys from B override A |
Outputs
| Port | Wire | Payload | Notes |
|---|---|---|---|
Resultoutput | Execute + Dataexecute_data | object |
Configuration
| Field | Type | Default | Description |
|---|---|---|---|
Deep mergedeep | boolean | true | 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.