Developer tools

JSON to CSV converter

Turn JSON into CSV with a table preview, editable column order and exact number text. Select nested records, handle missing fields, and download locally.

Paste JSON or import a UTF-8 file up to 1 MiB. An array of objects becomes one row per object.

Source: editor text.

Import JSON or drop a file here

Your file stays on this device. Import supports Undo.

Select nested records or expand objects

Leave blank for the whole document. For an API response, /data/records selects that array. Escape / in a key as ~1 and ~ as ~0.

Expanded headings use paths such as /profile/city. Arrays stay as JSON in one cell. By default, nested objects also stay in one cell.

Add JSON or try the example. No file is uploaded or saved automatically.

Turn JSON records into a useful table

Paste an array of objects and choose Convert JSON. Columns include properties found in later rows, in first-seen order. Missing properties become empty fields. Review the table, then choose, rename or move individual columns before downloading. A single object becomes one row. Arrays of arrays use positional columns; arrays of scalar values use a single value column. Mixing objects, arrays and scalar rows is rejected so records are not silently reshaped.

Nested records and objects

Use JSON Pointer to select records inside an API response, for example /data/records. Pointer segments escape a literal slash as ~1 and a tilde as ~0. Expand nested objects when you need separate columns. Expanded names use the same escaping, keeping keys with dots, slashes or tildes distinct. Nested arrays and empty objects remain compact JSON in one cell; arrays are never multiplied into extra rows.

Keep values predictable

Numeric literals are carried directly into the CSV text, preserving large integers, decimal spelling, exponents and negative zero. String IDs such as 001 retain their characters. Nested JSON is compacted without rounding numbers. Duplicate JSON keys are rejected because a table cannot represent them unambiguously. JSON strings decode their escapes into real characters; isolated Unicode surrogates and NUL string cells are rejected.

Missing properties always become empty fields. JSON null also becomes empty unless you choose the text null. Empty strings, missing values and null can therefore look identical in CSV. The source table labels them separately so you can decide before exporting. CSV has no type metadata: spreadsheets can interpret numbers, dates and leading zeros. Use the spreadsheet's import dialog and Text column type when exact text matters.

CSV quoting and formula-like text

Commas, quotes, record breaks and leading/trailing whitespace are quoted; quotes inside a field are doubled. Choose another separator, LF endings, all-field quoting or a UTF-8 BOM when your importing application requires it. Every nonempty record set has a final record ending. Copy and Download use the same complete output, including a selected BOM.

By default, formula-like string cells and headings receive an apostrophe prefix. This is an explicit text change; the result reports how many cells changed. Detection includes =, +, -, @, their full-width variants after whitespace, and leading tab/record breaks. Actual JSON number tokens are not prefixed. There is no universal protection across spreadsheet applications or save/reopen cycles; see OWASP's CSV injection guidance. Disable the option for exact data interchange and import untrusted text as Text.

Local processing and recovery

Files stay in your browser. Import, example, clear and large paste support one replacement Undo, including previous column settings and record selection. Try example resets the record path; Undo restores it. Undo also restores export options, the source filename and your place in the table. A first conversion focuses the table for review; updating existing data takes you to the CSV preview. Ordinary typing clears that history. Matching source structure retains column choices on reread. Source and option changes hide obsolete output. Download your result before leaving; there is no automatic saving.

Input is limited to 1 MiB UTF-8, 100 nested container levels and 100,000 JSON values. Output is limited to 10,000 rows, 200 columns, 200,000 cells and 4 MiB. An empty array produces no CSV records; rows with no fields need a different selection. File reading and conversion have ten-second deadlines and Cancel. The text preview stops at 32,768 characters; exports are complete. For the reverse workflow, use CSV to JSON.