The JSON to CSV converter accepts a JSON array containing up to 10,000 objects in the browser tab and turns it into a downloadable comma-separated file called converted.csv. Every step — JSON parsing, schema discovery, CSV escaping, preview rendering, and Blob URL creation — happens locally, so the source data is never uploaded. Output follows the common RFC 4180 rules: fields are separated by commas, records by CRLF, and any cell containing a comma, double quote, CR, or LF is wrapped in double quotes with internal quotes doubled. The converter caps input at 1,000,000 JavaScript characters, schemas at 200 columns, and the resulting CSV at 5,000,000 characters; crossing any limit returns an error and produces no shortened file. Nested objects and arrays are not flattened into dotted column names — they are serialized as compact JSON inside a single CSV cell and then quoted. Default formula-injection protection prefixes any string value or header that begins with =, +, -, @, tab, carriage return, or a similar trigger with a leading apostrophe before CSV escaping, and the result summary reports how many cells received that prefix.

What "Bulk" Means Inside the JSON to CSV Tool
The word "bulk" in this context points to a specific constraint set, not a script that loops over files. The tool is a single-tab converter with four explicit numerical limits that decide whether your input converts or returns an error. Crossing any one returns a message and writes no partial CSV.
| Boundary | Limit | What happens on overflow |
|---|---|---|
| Input size | 1,000,000 JavaScript characters | Error, no CSV produced |
| Rows in array | 10,000 objects | Error, no CSV produced |
| Discovered schema | 200 columns | Error, no CSV produced |
| Generated CSV | 5,000,000 characters | Error, no CSV produced |
Each limit fails the same way: no shortened file, no silent truncation, and no upload. The text area still shows the over-limit input and highlights it in the counter rather than trimming characters while you type. Editing the JSON clears the previous output, error, and download URL before a new attempt. That deterministic behavior is what makes bulk conversion safe to push toward the cap.
Convert a Large JSON Array to CSV
- Paste a non-empty JSON array whose every element is an object into the converter — for example [{"name":"Alice","age":30},{"name":"Bob","age":31}]. Confirm the visible counter stays below the 1,000,000-character mark.
- Trigger conversion. The browser parses the JSON locally, scans the records from first to last, and adds a new column the first time each field appears. Missing fields and explicit null values become empty cells.
- Inspect the preview that mirrors the exact text of the Blob. Check column order, the way nested objects and arrays render as compact JSON inside one cell, and the summary that reports how many string cells received a leading apostrophe for formula protection.
- Download converted.csv directly. The MIME type is text/csv;charset=utf-8. Choose UTF-8 comma-separated import settings in the receiving application rather than relying on locale autodetection.
What Changes When Records Get Larger
At small scale, quoting and field discovery barely register. Past a few hundred rows, four behaviors start to matter.
Column discovery is order-sensitive. The first record defines the leftmost columns. Each subsequent record can add new fields to the right when it introduces them for the first time, but the relative order of earlier columns is fixed. If row 1 carries ["name","age"] and row 2 adds "role", the schema becomes name,age,role even though role appears only in row 2. A field that exists in row 1 but is missing from row 50 simply becomes an empty cell in that row — no error, no shifting of later columns.
Nested values stay nested. A field whose value is an object or array — for example {"address":{"city":"Berlin","zip":"10115"}} — is not split into address.city and address.zip. It is serialized as compact JSON inside one CSV cell. The CSV escaping then doubles the inner double quotes and wraps the cell in double quotes because of the commas. A consumer that needs the original structure must parse that cell as JSON; flattening would have invented a dotted naming convention that could collide with real field names or lose array structure.
Primitives stay literal. false, true, and numeric values like -42 are JSON-typed data rather than attacker-controlled formula strings, so they are not prefixed. -42 remains -42 in the CSV. Only string values — and headers — that start with =, +, -, @, tab, carriage return, or the same trigger after a leading BOM or no-break space receive a leading apostrophe before escaping.
Quoting follows RFC 4180 strictly. A field is wrapped in double quotes only if it contains a comma, a double quote, CR, or LF. Inside a quoted field, every double quote is doubled. Records join with CRLF. Empty values stay empty. The output is intentionally deterministic — no trimming, no BOM, no locale-based delimiter swap.
Reviewing the CSV Before You Save It
The preview pane shows the same complete string that the Blob will write, so quoting, formula prefixes, column order, and nested JSON can all be checked before download. Three checks catch almost every real-world bulk mistake.
First, look at the header row. If the headers are in the wrong order, your records are in the wrong order — paste them sorted before re-running. If a header shows a leading apostrophe, it began with a formula trigger; the apostrophe is intentional and keeps spreadsheet programs from treating the header as a formula.
Second, count the rows in the preview against the rows in the source array. A mismatch means a record was truncated, contained an unsupported shape (a primitive row, an array row, or null), or was silently dropped during parsing. The converter rejects those shapes with specific messages rather than guessing.
Third, scan for cells that begin with a double quote. Every such cell contains embedded quotes, a comma, or a line break — the converter quoted it on purpose. If a particular nested object looks truncated, open the source JSON and confirm the structure was complete before assuming a converter bug.
Importing converted.csv Into a Spreadsheet Safely
Once you have converted.csv, the next program decides how the file is interpreted. Two settings matter for bulk imports.
Encoding. The converter emits text/csv;charset=utf-8 with no BOM. In Excel's "From Text/CSV" wizard, choose UTF-8 explicitly. In Google Sheets, the import dialog usually detects UTF-8 automatically. If non-ASCII characters look wrong after import, the encoding was treated as Windows-1252; re-import with UTF-8 rather than re-running the converter. For developers who do need to detect or strip a stray BOM from incoming CSVs in other pipelines, see the guide on removing a UTF-8 BOM without losing data.
Delimiter. Stick with comma. The converter does not change delimiters based on browser locale, so the file is always comma-separated with CRLF record endings. If a spreadsheet tries to import a semicolon-delimited file, that is a locale-side assumption, not a converter behavior. For the canonical CSV definition and its documented field and record rules, consult the Library of Congress CSV description.
Formula protection inside the converter is the default, and there is no switch to disable it. The mitigation reduces a common risk called out in the OWASP CSV Injection guidance but is not a universal security guarantee. A later application could strip the apostrophe or reinterpret text. Review untrusted exports before opening them in software that can execute formulas, commands, links, or external data connections. For datasets where the apostrophe is a problem — for example, numeric IDs that happen to start with = — fix the source values rather than disabling protection, and keep the original JSON whenever types and structure matter, since CSV does not carry data types or a nested schema.
Related reading: Convert JSON to Excel Without Power Query: A Browser Workflow.