Se costruisci automazioni per il marketing, capire come viaggiano i dati fa la differenza tra un workflow fragile e uno che scala. In n8n tutto ruota attorno a json n8n: ogni nodo riceve e produce un array di “items”, ciascuno con un wrapper json e, quando serve, una parte binary per i file. Saper leggere, mappare e trasformare questi items significa spedire lead al CRM senza errori, creare copy personalizzati, deduplicare liste e consolidare report. In questa guida pratica entriamo nel vivo della struttura dati di n8n, vedendo come si rappresentano oggetti e array nell’editor, come funzionano le espressioni con $json e $input, e come usare i nodi Split Out, Aggregate e Merge per dividere, raggruppare e combinare stream. Per i casi più tecnici, useremo il Code node per trasformare dati e fare parsing di stringhe JSON, con snippet pronti da copiare. Chiudiamo con best practice di performance e debug, così puoi far crescere i volumi (e i risultati) senza perdere controllo.

📚 Nuovo a n8n? Parti dalla guida completa: cos'è n8n e come funziona.

Che cos’è JSON e come viene visualizzato nell’editor

JSON è il formato di scambio dati più usato nelle API: chiave/valore, tipi semplici (string, number, boolean, null) e strutture complesse (object, array). Nell’editor n8n, ogni nodo mostra l’output in tabella o in struttura ad albero: ciò che vedi è sempre un array di items. A livello visivo, l’editor ti fa navigare facilmente tra i campi e i valori; a livello logico, ogni item è un payload indipendente che fluisce al nodo successivo.

Per i marketer, questo significa due cose:

  • Ogni record (lead, riga di foglio, evento) è un item: puoi lavorare “per record” e scalare senza cambiare logica.
  • Le trasformazioni si fanno in modo coerente: un nodo applica la stessa regola a tutti gli items in input.

Esempio di JSON nell’editor per un singolo item:

{
“email”: “maria@example.com”,
“firstName”: “Maria”,
“utm”: { “source”: “ads”, “campaign”: “spring-sale” },
“leadScore”: 87
}

In un workflow reale, quasi sempre l’output di un nodo è un array di items (anche se ne vedi uno solo in test). Questo design rende semplici operazioni come lo split e l’aggregazione di dati in n8n, due pattern che userai spesso per richieste API con risposte “a lista” o per consolidare risultati in un report finale. Capire come l’editor visualizza oggetti (object) e liste (array) ti aiuta a fare mapping dei campi tra nodi con sicurezza, senza confondere singolo item e collezioni.

Keyword utili da ricordare: struttura dati di n8n, array di items nei workflow, mapping dei campi tra nodi.

La struttura dati di n8n: come è fatto un item

In n8n, i dati si muovono sempre come array di items. Ogni item ha:

  • json: l’oggetto con i tuoi campi business
  • binary (opzionale): metadata e contenuti file

Esempio completo di item:
{
“json”: {
“email”: “maria@example.com”,
“firstName”: “Maria”,
“utm”: { “source”: “ads”, “campaign”: “spring-sale” },
“leadScore”: 87
},
“binary”: {
“attachment”: {
“fileName”: “brochure.pdf”,
“mimeType”: “application/pdf”,
“data”: “…”
}
}
}

Dettagli importanti:

  • items e campo json in n8n: il wrapper json è obbligatorio. Dalla v0.166.0, se dimentichi “json” n8n prova ad aggiungerlo automaticamente, ma è buona pratica rispettare la struttura.
  • Differenza tra singolo item e più items: molti nodi (es. HTTP Request) possono restituire 1 item con dentro un array; altri producono già più items. Sapere cosa hai in mano evita errori di path.
  • Gestione dati binari in n8n: se lavori con allegati (PDF dell’offerta, immagini prodotto), il binary vive accanto al json; molti nodi espongono opzioni per includere/propagare i binari.

Per marketing, un pattern efficace è definire presto i campi chiave (nome, email, campaign, segment, score) e mantenerli coerenti lungo il flusso. Questo rende naturale la validazione di oggetti JSON e la creazione di copy personalizzati per email/Slack. Se arrivano risposte API complesse (nested array), userai i nodi di trasformazione per riallinearle alla struttura attesa.

Long-tail consigliate: struttura dati di n8n, items e campo json in n8n.

Espressioni e mapping: $json, $input e reference tra nodi

Le espressioni trasformano campi statici in dinamici. Alcune forme utili:

  • Valori correnti: {{ $json.email }}
  • Annidati: {{ $json.utm.campaign }}
  • Da un nodo precedente: {{ $node[“HTTP Request”].json.results[0].name }}
  • Fallback: {{ $json.company || “N/A” }}
  • Composizione: {{ $json.firstName + ” ” + $json.lastName }}
  • Tipi e calcoli: {{ Number($json.total) * 1.22 }}

Con espressioni con $json e $input puoi anche lavorare sui dataset in nodi avanzati:

  • $input.first(): primo item in input
  • $input.all(): tutti gli items in input (utile nel Code node per aggregazioni personalizzate)

Esempi rapidi di mapping dei campi tra nodi:

  • Oggetto email dinamico (Gmail > Subject):
    Nuova richiesta da {{ $json.firstName }} per la campagna {{ $json.utm.campaign }}
  • Link a dati di un HTTP Request precedente:
    {{ $node[“HTTP Request”].json.data.url }}

Best practice:

  • Mantieni i nomi campo coerenti (Set node per creare oggetti “puliti” all’ingresso).
  • Evita path errati su array annidati (verifica se stai leggendo l’elemento [0] o una lista intera).
  • Attento ai tipi inattesi: se un’API restituisce numeri come stringhe, convertili dove serve.

Per i marketer è la base della personalizzazione: unisci i dati di origine (form, CRM, analytics) e costruisci messaggi/segmentazioni con poche espressioni. Così automatizzi nurturing, scoring e notifiche restando allineato al contesto.

Long-tail consigliate: espressioni con $json e $input, reference a valori annidati.

Trasformazioni no-code: Split Out e Aggregate

n8n fornisce due nodi core per trattare liste senza scrivere codice:

  • Split Out: separa una lista in più items
  • Aggregate: raggruppa più items in un singolo oggetto/lista

Split Out node (separare un array in items)

  • Field to Split Out: il campo che contiene la lista (es. results)
  • Include: scegli se includere “No Other Fields”, “All Other Fields” o “Selected Other Fields”
  • Opzioni utili: Disable Dot Notation, Destination Field Name, Include Binary

Scenario tipico: un’API ritorna { results: […] } come unico item.
Configurazione:

  • Field to Split Out: results
  • Include: No Other Fields
    Risultato: avrai un item per ogni elemento di results. Perfetto per iterare su lead, prodotti, eventi.

Aggregate node (raggruppare items)
Modalità principali:

  • Individual Fields: raccogli singoli campi in liste
  • Input Field Name, Rename Field (toggle), Output Field Name
  • Opzioni: Disable Dot Notation, Merge Lists, Include Binaries, Keep Missing And Null Values
  • All Item Data: metti tutti i dati in un campo lista
  • Put Output in Field (es. data_object)
  • Include: All fields, Specified Fields, All Fields Except

Caso d’uso marketing: consolidare 100 risultati in un unico item per inviare un report ai colleghi o alla BI.
Configurazione All Item Data:

  • Put Output in Field: data_object
  • Include: All fields
    Risultato: un item con json.data_object contenente la lista completa.

Questo approccio copre gran parte delle esigenze comuni: split e aggregazione di dati in n8n senza toccare codice, riducendo errori e tempi di sviluppo.

Long-tail consigliate: split e aggregazione di dati in n8n, Aggregate/Split Out.

Trasformazioni con codice: Code node e parsing di stringhe JSON

Quando le regole superano i limiti del no-code, entra in gioco il Code node per trasformare dati. Puoi usare:

  • Run Once for Each Item: modifica item per item
  • Run Once for All Items: opera su tutto il batch in una volta (aggregazioni, pivot, enrichment)

Esempi pratici:

1) Creare un dataset da zero
return [
{ json: { name: ‘Alice’, email: ‘alice@example.com’ } },
{ json: { name: ‘Bob’, email: ‘bob@example.com’ } }
];

2) Arricchire ogni item
let items = $input.all();
for (const item of items) {
item.json.fullName = ${item.json.firstName} ${item.json.lastName};
item.json.segment = item.json.leadScore >= 80 ? ‘VIP’ : ‘Standard’;
}
return items;

3) Splittare un array presente nel primo item (equivalente a Split Out)
return $input.first().json.results.map(r => ({ json: r }));

4) Aggregare tutti gli items in un unico campo
return [
{
json: {
data_object: $input.all().map(i => i.json)
}
}
];

Parsing di stringhe JSON in n8n (API che rispondono con JSON “in stringa”)

  • In un’espressione: {{ JSON.parse($json.payload) }}
  • Nel Code node con gestione errori:
    const first = $input.first();
    let parsed;
    try {
    parsed = JSON.parse(first.json.payload);
    } catch (e) {
    parsed = { parseError: String(e), raw: first.json.payload };
    }
    return [{ json: parsed }];

Questa tecnica risolve un pain point diffuso (mancanza di un “JSON Parser” dedicato) e consente validazione, fallback e logging. Aggiungi check su chiavi obbligatorie e tipi (string, number, boolean, null, array, object) per prevenire rotture downstream.

Long-tail consigliate: Code node per trasformare dati, parsing di stringhe JSON in n8n.

Combinare stream: Merge node e combinazione di items

Il Merge node combina flussi multipli con diverse modalità. Parametri chiave:

Mode: Append

  • Mantiene tutti i dati di ogni input in sequenza
  • Number of Inputs: scegli quanti ingressi unire
    Uso tipico: concatenare liste da fonti diverse.

Mode: Combine

  • Combine By: tre strategie
    1) Matching Fields

    • Fields to Match: campi su cui confrontare (es. language)
    • Output Type: Keep Matches (inner join), Keep Non-Matches, Keep Everything (outer), Enrich Input 1 (left), Enrich Input 2 (right)
      2) Position
    • Combina per indice (item 0 con item 0, ecc.)
    • Opzione: Include Any Unpaired Items per mantenere gli items “senza coppia”
      3) All Possible Combinations
    • Prodotto cartesiano di tutte le combinazioni

Options (Combine)

  • Clash Handling: priorità tra input in caso di stesso nome campo; Deep Merge vs Shallow Merge
  • Fuzzy Compare: “3” e 3 considerati uguali se attivo
  • Disable Dot Notation: disabilita l’accesso tipo parent.child
  • Multiple Matches: Include All Matches oppure Include First Match Only

Altre modalità:

  • SQL Query: scrivi query (AlaSQL) tipo SELECT … JOIN per un controllo totale
  • Choose Branch: scegli quale input mantenere (Input 1 Data, Input 2 Data, Single, Empty Item)

Esempio “saluta utenti nella loro lingua”:

  • Input 1 (utenti): [{ name: ‘Stefan’, language: ‘de’ }, { name: ‘Jim’, language: ‘en’ }]
  • Input 2 (greeting): [{ greeting: ‘Hallo’, language: ‘de’ }, { greeting: ‘Hello’, language: ‘en’ }]
    Configurazione:
  • Mode: Combine
  • Combine By: Matching Fields
  • Fields to Match: language (per entrambi gli input)
  • Output Type: Keep Matches
    Risultato: ogni utente ha il greeting corretto.

Insight pratico: per dataset irregolari, testa “Position” con Include Any Unpaired Items, oppure passa a “Matching Fields” con Keep Everything per non perdere righe utili.

Long-tail consigliate: Merge node e combinazione di items, mapping dei campi tra nodi.

Debug, validazione e performance su grandi dataset

Errori tipici da evitare:

  • JSON come stringa non parsata: risolvi con JSON.parse in espressione o Code node
  • Path errati su array annidati: verifica se accedi a [0] o alla lista intera
  • Tipi inattesi (string vs number): normalizza prima dei confronti/ordinamenti
  • Campi mancanti/null: definisci default o scarta in modo esplicito

Tecniche di debug nell’editor e con il Code node:

  • Test incrementale: Manual Trigger → 1 nodo → verifica struttura → aggiungi passi
  • Data pinning: fissa l’output di un nodo per test ripetibili senza chiamare API
  • Check mirati: aggiungi un Edit Fields (Set) o Code per validare chiavi obbligatorie (email, campaign) e normalizzare valori null/undefined
  • Logging: costruisci un item “log” aggregato a fine flusso con Aggregate (All Item Data) per ispezioni rapide

Best practice per performance con molti items:

  • Filtri a monte: usa Limit/Filter prima di chiamate costose
  • Loop Over Items (Split in Batches): processa in batch (es. batchSize 50) per rispettare rate limit e memoria
  • Trasformazioni incrementali: split → process → aggregate solo se necessario
  • Attenzione ai nodi “costosi”: riduci chiamate API duplicate usando il pin in sviluppo e caching logico dove possibile

Snippet di validazione in Code node (chiavi obbligatorie):
let items = $input.all();
const required = [’email’, ‘utm’, ‘leadScore’];
items = items.filter(i => required.every(k => i.json[k] !== undefined && i.json[k] !== null));
return items;

Questo approccio alza la qualità del dataset e riduce gli errori a valle (es. invii falliti verso CRM o tool email).

Long-tail consigliate: best practice per performance con molti items, validazione di oggetti JSON.

Quick Takeaways

  • La struttura dati di n8n è un array di items con wrapper json: progetta flussi pensando “per item”.
  • Usa espressioni con $json e $input per mapping robusti e copy dinamici senza codice.
  • Split Out e Aggregate risolvono l’80% delle trasformazioni su liste senza scrivere JS.
  • Merge combina stream in modi diversi (Matching Fields, Position, All Possible Combinations) con opzioni utili come Clash Handling e Fuzzy Compare.
  • Per parsing di stringhe JSON in n8n usa JSON.parse in espressione o nel Code node con try/catch.
  • Con dataset grandi, filtra a monte e usa Loop Over Items (Split in Batches) per stabilità e rispetto dei limiti API.

Conclusione

Padroneggiare json n8n significa saper leggere e modellare i dati alla base delle tue automazioni. Abbiamo visto come l’editor rappresenta oggetti e array, come funziona il wrapper degli items e come impostare mapping affidabili con espressioni. Con Split Out e Aggregate trasformi liste in pochi clic, mentre il Code node ti dà la flessibilità per parsing e regole complesse. Il Merge node ti consente di ricomporre stream in modo preciso, con modalità che coprono sia casi “one-to-one” che “many-to-many”. Infine, un approccio di debug e performance orientato a test incrementali, validazione e batch ti assicura flussi stabili anche a volumi elevati.

Se vuoi accelerare la produttività di marketing, parti da un caso reale (raccolta lead, enrichment, segmentazione) e costruisci il flusso così: normalizza con Set, splitta con Split Out, arricchisci, fai merge dove serve e consolida un report con Aggregate. Testa con pin, valida le chiavi critiche e passa a batch in produzione. Il risultato sarà un’automazione più solida, veloce da mantenere e pronta a scalare con le tue campagne.

FAQ

1) Che cosa sono gli “items” e il campo json in n8n?

  • Ogni nodo scambia un array di items; ciascun item ha un wrapper json con i dati business e, opzionalmente, binary per i file. È la base della struttura dati di n8n.

2) Come faccio il mapping tra nodi con espressioni?

  • Usa espressioni con $json e $input: ad esempio {{ $json.email }} o {{ $node[“HTTP Request”].json.results[0].name }}. Così referenzi valori annidati e output di nodi precedenti.

3) Come divido una lista in più items senza codice?

  • Con lo Split Out node. Imposta Field to Split Out (es. results) e scegli Include (No/All/Selected Other Fields). Otterrai un item per elemento della lista.

4) Come raggruppo più items in un unico oggetto/lista?

  • Con l’Aggregate node. In “All Item Data”, imposta Put Output in Field (es. data_object) e l’opzione Include. In “Individual Fields” puoi aggregare campi specifici con opzioni come Merge Lists.

5) Come parse un JSON che arriva come stringa?

  • In un’espressione: {{ JSON.parse($json.payload) }}. Oppure nel Code node con try/catch per gestire errori. È il workaround più pratico al parsing di stringhe JSON in n8n.

Hai trovato utile questa guida? Dimmi quale passaggio della struttura dati di n8n ti ha chiarito di più le idee e condividila con il tuo team: quale workflow basato su JSON vuoi ottimizzare per primo?

Vuoi automazioni AI su misura per la tua azienda?
Scopri la consulenza →