CSV ↔ JSON Converter
Convert CSV to JSON or JSON to CSV in your browser. Auto-detect delimiter, header row, and types. No upload — your data stays private.
[
{
"name": "Ada",
"age": 32,
"city": "London",
"active": true
},
{
"name": "Charles",
"age": 46,
"city": "Manchester",
"active": false
},
{
"name": "Grace",
"age": 29,
"city": "New York",
"active": true
}
], · 3 rows parsed.Use this free CSV ↔ JSON converter to round-trip tabular data between spreadsheet and API formats. It handles quoted fields, escaped quotes, and embedded newlines per RFC 4180, auto-detects the delimiter, and can coerce CSV strings into numbers, booleans, and null when you want clean JSON.
How to use it
No account, no upload — it all happens on your device.
What makes CSV harder than it looks
The format is older than HTTP, but every spreadsheet bends it differently.
CSV stands for "comma-separated values", but in practice CSV files use semicolons, tabs, or pipes depending on the locale and the source tool. They also have to encode commas, line breaks, and quotes that appear inside a value. RFC 4180 defines the canonical rules; this tool follows them:
- Fields containing the delimiter, a newline, or a double quote must be wrapped in double quotes.
- Inside a quoted field, embedded double quotes are escaped by doubling them (
he said ""hi""representshe said "hi"). - A field may span multiple lines as long as it stays inside its quotes.
- The first row may or may not be a header — there is no flag in the file itself, so you have to know.
Worked examples
A few input/output pairs to spot-check your data.
| CSV | JSON (with header, types coerced) |
|---|---|
| name,age Ada,32 Grace,29 | [ { "name": "Ada", "age": 32 }, { "name": "Grace", "age": 29 } ] |
| note,owner "line one line two",Ada | [ { "note": "line one\nline two", "owner": "Ada" } ] |
| msg "he said ""hi""" | [ { "msg": "he said \"hi\"" } ] |
When type coercion bites
The Auto-detect types option is convenient but lossy. Watch out for:
- Leading zeros.
007becomes the number7. If you need to preserve the literal digits (zip codes, phone numbers, product SKUs), turn type coercion off. - Very large integers. JavaScript numbers lose precision above 2^53. IDs from Postgres bigint columns belong in strings.
- Locale-formatted numbers. A value like
1,234.56from US-style CSV will be misread if the delimiter is also a comma — semicolon-delimited European CSVs often use commas as decimal points. - Booleans in disguise."TRUE", "Yes", "1" — only the lowercase
trueandfalseare coerced here. Anything else stays as a string.