TSV to JSON converter
Tab-separated files come out of databases, analytics tools and spreadsheet "save a copy" menus. This page reads the tab as the separator — never a comma inside a cell — and writes an array of JSON records. With the header option on, the first row supplies the field names; with it off you get positional arrays instead.
Fields are read as text unless they look like plain numbers.
Processed on your device. Files aren’t sent anywhere.
Why tabs make this safer than CSV
A TSV row splits on literal tab characters, so commas inside a description, an address or a price need no quoting at all. That means a file exported by a database that never escaped anything still parses correctly here.
The parser is still quote-aware: if a cell happens to contain tabs wrapped in double quotes, the quoted run is read as one field, doubled quotes collapse to one, and a newline inside quotes stays inside the cell rather than starting a new row.
- Tabs are the delimiter; commas are ordinary text
- Quoted cells may contain tabs and line breaks
- Doubled quotes inside a quoted cell become one quote
- A UTF-8 byte-order mark at the start of the file is dropped
Rows that are entirely blank disappear
A line with no content at all is skipped, so trailing blank lines and stray spacing between blocks do not turn into empty records. A row that has real tabs but empty cells is kept, because those cells carry structure.
More tabs than header names
Each row is matched to the header by position. Extra tabs in a row are ignored, and a row with fewer fields than the header leaves the missing keys as empty strings. Nothing is truncated or guessed.
Header on or off
With First row is a header enabled, row one becomes the keys and every later row becomes an object. An empty header cell is named column1, column2 and so on, so a malformed header still produces usable records.
Turning the option off treats every row, including the first, as data: the output is an array of arrays. That is the right setting for files whose first line is already real content rather than labels.
- Header on: array of objects keyed by the first row
- Header off: array of arrays, rows kept in order
- Duplicate header names collapse — the last column with that name wins
- Blank header cells are named column1, column2, ...
Readable indentation or compact output
The Readable indentation toggle controls the JSON layout: two-space indentation for reading and diffing, or compact single-line output for feeding into another tool. The data itself is identical either way.
Which cells become numbers
A cell is converted to a JSON number only when it looks like a plain decimal: an optional minus sign, digits, and an optional fractional part. Everything else remains a string.
That distinction matters for identifiers. 007 stays the string "007", so account codes, postcodes and ZIP codes keep their leading zeros, while a plain 1200 becomes the number 1200. Exponential forms such as 1.5e3 also stay strings.
- Plain integers and decimals become JSON numbers
- Leading-zero identifiers remain strings
- 1.5e3 and other exponent notation remain strings
- Very large integers typed as numbers can lose precision
Empty cells and the difference from null
An empty cell becomes an empty string, not null. Downstream code that distinguishes "no value" from "empty value" should check for the empty string, because this converter never invents null.
Limits, privacy and typical input
One file may be up to 50 MiB and you may convert up to 10 files in a batch. Parsing happens in this browser tab, so an export containing customer records never leaves the machine — there is no upload step and no account.
Common sources are database text exports, analytics dumps and spreadsheet copies. The reported row count after conversion is a quick sanity check against the row count in the original file.
- Up to 10 files, 50 MiB each
- Row count is reported after conversion
- Unicode text — Cyrillic, accents, CJK — is preserved as-is
- Output file is named after the input with a .json suffix
This is a shape change, not a round trip
JSON to TSV flattens nested objects into dotted columns and writes arrays as JSON text inside a cell, so converting back does not restore the original file byte-for-byte. Quoting and typing are not symmetric; keep the original export if you need it verbatim.