n8n expressions support dot notation to traverse nested objects without writing any code.
n8n expressions support dot notation to traverse nested objects without writing any code. This eliminates the need for intermediate Code nodes when you simply need to pull a value out of a deeply nested API response. Combine dot notation with bracket notation for arrays.
Real-world example: A Shopify order webhook returns deeply nested shipping address data. You need the city and postal code for a shipping rate lookup.
// Incoming Shopify order (simplified):
{
"order": {
"id": 987654321,
"shipping_address": {
"city": "Portland",
"province": "Oregon",
"zip": "97201",
"country_code": "US"
},
"line_items": [
{ "sku": "WIDGET-01", "quantity": 3 },
{ "sku": "GADGET-05", "quantity": 1 }
]
}
}
```text
Use these expressions in an Edit Fields node or directly in downstream nodes:
```text
City: {{ $json.order.shipping_address.city }}
Zip: {{ $json.order.shipping_address.zip }}
Country: {{ $json.order.shipping_address.country_code }}
First SKU: {{ $json.order.line_items[0].sku }}
Item Count: {{ $json.order.line_items.length }}
```text
> **Warning: Watch for Undefined Paths**
>
> If any segment of the path does not exist, the expression returns `undefined` and may cause errors in downstream nodes. Combine with the fallback pattern from Tip 8: `{{ $json.order.shipping_address.city || "N/A" }}`.
The result is clean, readable field extraction without a single line of JavaScript.
**Related:** [Flatten Deeply Nested API Responses](../code-node-mastery/01-flatten-deeply-nested-api-responses.md) | [Use the HTTP Request Node as a Universal Connector](../integration-patterns/01-use-the-http-request-node-as-a-universal-connector.md)
I build production n8n and Cloudflare automation for teams — the same engineering behind HarperFlow. Fixed-price, escrow-protected, US-based.