CSV ⇄ JSON

Converts CSV to JSON and JSON to CSV, with flexible delimiters and nested data.

You can also drag and drop a file here.

Delimiter

Indentation

What is CSV

CSV (Comma-Separated Values) is a text format for tabular data — each line is a record, each value in a line is separated by a delimiter (traditionally a comma). Fields containing the delimiter itself, quotes, or a line break are wrapped in double quotes, with internal quotes doubled ("") — the rule defined by RFC 4180, the de facto standard followed by Excel, Google Sheets, and the vast majority of tools on the market.

Delimiters other than comma

Despite the name, not every CSV uses a comma: Excel in a regional setting that uses a comma as the decimal separator (like Brazil) exports CSV with a semicolon (;) by default, to avoid confusing the column separator with the decimal separator. TSV (Tab-Separated Values) and the pipe (|) also show up in exports from various systems. "Automatic" mode detects the delimiter from the content itself; the manual choice exists for cases where detection isn't enough (e.g. very few lines, or an unusual delimiter).

Nested data (JSON → CSV)

CSV has no notion of nesting — it's always a flat grid of rows and columns. When converting JSON to CSV, a nested object like { "address": { "city": "..." } } becomes a column "address.city"; an array like { "tags": ["a", "b"] } becomes columns "tags.0", "tags.1". The reverse path doesn't exist: converting that CSV back to JSON doesn't reconstruct the nesting — "address.city" comes back as a literal key (with a dot in the name), not as a nested object.

Type inference (CSV → JSON)

Every value in a CSV is, originally, text. With "Automatically infer types" enabled, values that look like a number ("42", "3.14") or a boolean ("true", "false") become number/boolean in the JSON — the most useful behavior in most cases. Turn it off when the original format matters more than the numeric value: a postal code, barcode, or any identifier with a leading zero ("007") loses those zeros when turned into a number; with inference off, those values stay exactly as they were in the CSV.

Frequently asked questions

No. All conversion happens in your browser — the CSV or JSON you paste here never travels over the internet and is never logged anywhere.

Leave it on "Automatic" in most cases — the tool detects the delimiter used in the pasted CSV. Choose manually when you already know the file uses a semicolon (common in spreadsheet exports from Brazil), tab (TSV), or another separator, or when automatic detection doesn't get it right because the CSV has very few lines.

Each nesting level becomes its own column, using a dot to compose the name ("customer.name", "items.0", "items.1") — see the "Nested data" section, above.

No. "customer.name" comes back as the literal key "customer.name" in the JSON, not as { "customer": { "name": ... } }. This is a known, deliberate limitation of this version — reconstructing nesting from a column name would require guessing the intent behind a dot in the name (a purposeful compound key vs. nesting), which isn't always safe to assume.

With "Automatically infer types" enabled (default), any value that looks numeric becomes a number, and numbers don't have leading zeros. To preserve the original value — postal code, barcode, membership number — turn this option off before converting.

File upload accepts up to 5 MB. Pasting directly into the text field has no technical limit, but very large files may slow the browser down.

The conversion is rejected with a message pointing to the problem row — a CSV with an inconsistent column count between rows usually indicates a wrong delimiter or a missing quote around a field, and converting it anyway would produce a misleading JSON.