Convert a JSON array of objects into CSV ready for Excel, Google Sheets, or any data tool. Handles nested objects (flattened with dot notation), missing fields, custom separators, and proper escaping of special characters.
CSV will appear here
CSV (Comma-Separated Values) is the lingua franca of data analysis. Excel, Google Sheets, Numbers, Tableau, R, pandas, SPSS, and every other spreadsheet or stats tool reads CSV natively. JSON, by contrast, is the standard for APIs and structured data interchange.
Converting JSON to CSV bridges these two worlds. When you have data from an API or NoSQL database in JSON form and need to analyze it in a spreadsheet, this is the conversion you need. Common scenarios: exporting data for a non-technical stakeholder, loading API responses into a BI tool, importing into a relational database, or just sorting and filtering in Excel.
CSV is a flat format — each row is a list of values, no nesting. JSON, by contrast, supports arbitrary nesting. Our converter handles this by flattening nested objects using dot notation:
[
{
"id": 1,
"name": "Alice",
"address": {
"city": "NYC",
"zip": "10001"
}
}
]
becomes:
id,name,address.city,address.zip 1,Alice,NYC,10001
Arrays inside objects are preserved as JSON strings in the cell — keeping the information intact without trying to expand into multiple rows (which would lose the row-to-row correspondence).
Pull data from an API, convert to CSV, drop into Excel for pivoting, charting, and ad-hoc analysis.
Tableau, Power BI, Looker — all accept CSV directly. Convert JSON exports to feed into BI dashboards.
PostgreSQL, MySQL, SQLite all support CSV import. Convert JSON data to CSV to load with COPY FROM or LOAD DATA INFILE.
Stakeholders who don't know JSON can read CSV directly in their email client or attached spreadsheet.
pandas.read_csv() is the most common way to load data into Python. R's read.csv() is similar.
When migrating from a JSON-based system to a tabular one, CSV is the intermediate format that travels through almost any pipeline.
[{"name":"Alice","age":30},{"name":"Bob","age":25}]. Each object becomes one row. The union of all keys across all objects becomes the CSV columns. If different objects have different keys, missing values become empty cells.{"user":{"name":"Alice"}} becomes a column called user.name. Multi-level nesting works the same way: {"a":{"b":{"c":1}}} produces a column a.b.c.{"tags":["a","b"]} produces a cell containing ["a","b"]. We don't expand arrays into multiple rows because that would break the row-to-object correspondence — but if you need that, post-process the CSV in Excel or pandas.Hello, World becomes "Hello, World" in the CSV.pandas.read_csv('file.csv').to_dict('records') in Python, or papaparse.parse(csv, {header: true}).data in JavaScript.[{...}]. If you have an object whose values are objects, you may need to transform first — for example, Object.values(yourObject) in JavaScript or list(your_dict.values()) in Python.jq -r 'map([.field1,.field2]|@csv)[]' file.json > file.csv.