All guides
Data

Nested JSON to CSV: choose your rows and columns

Two records, five columns, and the details a CSV cannot preserve.

A JSON export can contain a list inside a list, while CSV needs rows and columns. Before converting, choose which list should become the table and what to do with the values inside each record.

This sample JSON contains two creators under data.items. Each has a nested creator object, a tags array and a note field. One note is null; the other is an empty string.

Pick the records before choosing columns

Open the CSV, JSON & YAML converter, import the sample and choose JSON in From, then CSV in To. Open Options and set Data path (optional) to /data/items.

Without that path, the outer object becomes one row. With it, the two items become two rows. The path selects data; it does not rename fields or search for matching values.

Paths use slash-separated names, following JSON Pointer notation. Enter /data/items, not data.items. If a field name itself contains a slash, write ~1 for that slash; use ~0 for a literal tilde.

Decide whether nested objects belong in one cell

With Flatten nested objects off, the columns are id, creator, tags and note. The creator object occupies one CSV cell as JSON text. That is valid CSV, but awkward if you want to sort by country.

Turn flattening on and the columns become:

/id
/creator/name
/creator/region
/tags
/note

Now Zoë and AU have their own cells. The slash-prefixed headers describe where each value came from. They also avoid confusing a literal field named creator.name with a nested field called name.

Compare the nested-cell CSV with the flattened CSV. Both have two data rows. The doubled quotes around JSON inside a CSV cell are escaping, not duplicated data.

Arrays do not turn into extra rows

Flattening expands nested objects. It does not split an array across rows or make a separate column for each array entry. In this example, /tags still contains a single JSON array in one cell:

["design","video"]

If your spreadsheet needs one row per tag, prepare that table explicitly first. Decide whether to repeat the creator's ID on each row and how to represent an empty tag list. The converter does not make those decisions for you.

Keep the JSON if you need to reconstruct it later

CSV has no built-in distinction between a missing value, null and an empty string. Both notes in this sample export as empty cells. Converting that CSV back with the default settings produces two empty strings.

The converted-back JSON also keeps /creator/name as a literal key and /tags as a string. It does not rebuild nested objects or parse the array automatically. Keep the original JSON as the source of truth.

The ID 001 survives this converter as text. A spreadsheet may still interpret it as a number when opening the CSV; import the ID column as text there too. Leave Protect CSV from spreadsheet formulas on for spreadsheet-bound exports, and review the file before sharing.

What we checked

On 8 October 2026, we ran the sample through the same conversion function as the tool. We checked both CSV variants, their two-row counts, the five flattened columns and the conversion back to JSON. The results file contains the outputs and download hashes.

The table preview shows up to 500 rows; it is not a count of everything in the export. Check the displayed total and downloaded file when working with a larger dataset.