Skip to converter

JSON to TSV converter

Tabs are the delimiter that survives a paste into a code editor, a pipe into awk or grep, and a database import that would otherwise split on a comma. This page turns JSON records into one tab-separated row each, naming columns after the keys it finds.

Nested objects are flattened into columns like address.city.

Drop files here or JSON, up to 50 MB each, 10 at a time
    Add a file to start.

    Processed on your device. Files aren’t sent anywhere.

    No sign-up. Nothing to install.

    Reading the JSON before any tab is written

    The file has to parse. A trailing comma or a stray quote stops the job with a decode error and no partial output. Once parsed, the shape decides the layout: an array yields a row per element, a lone object yields a single row, and a wrapper object such as {"orders": [...]} contributes the array it found inside.

    If the document is only a number or a string, it is still worth keeping: it lands in one row under a column called value instead of being thrown away.

    • Array of objects — header plus one row per element
    • Single object — one row
    • Wrapper object holding an array — the array is treated as the data
    • Bare scalar — one row in a column named value

    Column names come from the key paths

    Nested objects are walked down to their leaves and the path is joined with dots, producing headers like contact.phone or meta.author.name. Keys are collected in the order they first appear across all rows, so a ragged batch gives a wide header with gaps rather than a complaint.

    Nothing here is renamed, lowercased or merged. Two keys that differ only in case end up as two separate columns, which is usually the first thing to inspect in the header line.

    Arrays stay inside one cell

    A list is not spread sideways across columns. It is written as JSON text in the cell that owns it, so tags: ["a","b"] appears in the row exactly as ["a","b"]. That keeps the count intact, but the cell is no longer a scalar.

    If a downstream tool expects one value per column, split the list in the source JSON before converting, or keep the JSON file and parse it there.

    Why tab output rarely needs quotes

    Commas are everywhere in prose, so a comma-delimited file constantly has to wrap cells in quotes. Tabs almost never appear inside sentences, which means most rows here are emitted bare — no wrapping, no doubled quotes, and the file reads cleanly in any editor.

    A cell is wrapped only when it genuinely would break the layout: it contains a tab character, a quote character, or a line break. Inner quotes are doubled in the conventional way when that happens.

    • Wrapping happens only for tabs, quotes and line breaks in a cell
    • Commas, semicolons and spaces are written as ordinary text
    • A UTF-8 byte-order mark is added so spreadsheet software reads the encoding
    • Accented Latin, Cyrillic and CJK characters survive unchanged

    Cells that already contain tabs

    Pasted code snippets and copied terminal output often carry tabs of their own. Those cells get wrapped, but note that some strict tab readers treat every tab as a column boundary and ignore quoting rules — test the consumer before shipping a file full of wrapped cells.

    The byte-order mark

    Excel and Google Sheets look for the mark to decide the encoding; without it, accented names can arrive garbled. Plain text editors and command-line tools usually show the mark as an odd character at the start of the first line, which is cosmetic rather than a corruption.

    What a flat tab file cannot carry back

    A tab-separated table is text in columns and nothing else. Numbers arrive as text, booleans become their written names, and null is indistinguishable from an absent key — both leave the cell blank.

    The nesting itself is gone: address.city is a column name, not an object. Round-tripping the file back to JSON rebuilds objects keyed by those dotted names, and short numeric identifiers are typed as numbers, which can cost precision on very long ids.

    • Lost on the way out — nesting, JSON types, null as a distinct value
    • Kept — row order, cell text, the column names derived from keys
    • Never attempted — merging records, deduplicating keys, preserving JSON layout

    Turning the tab file back into JSON

    The reverse route reads the header line and produces an array of objects, one per row. Leading-zero identifiers such as 0012 are deliberately kept as strings so they do not silently become 12, while ordinary counts and prices are typed as numbers.

    When tabs beat commas, and the limits of this page

    Choose tab output when rows will be pasted into an editor, streamed through a shell pipeline, or loaded by an importer whose default delimiter is already a tab. It is also the safer shape when descriptions contain lots of commas.

    Files are capped at 50 MiB each and ten files per batch. Parsing, flattening and encoding all happen in this browser tab, so a dataset containing personal records stays on the machine — there is no upload step and no account.

    • Up to 10 files per run, 50 MiB each
    • The row count is reported once the job finishes
    • Malformed JSON is refused rather than half converted
    • The result keeps the original file name with a .tsv suffix

    This route always writes tabs

    There is no delimiter switch here — the point of the page is a guaranteed tab file. For comma or semicolon output with an explicit Separator control, use the JSON to CSV route instead.

    Very wide records

    Deeply nested documents can produce hundreds of dotted columns. If the header becomes unwieldy, prune the fields you do not need in the JSON first; a smaller, deliberate column list is easier to import than an exhaustive one.

    Questions

    Does JSON to TSV upload my data?
    No. The file is parsed and encoded in your browser tab; there is no upload step, no server-side copy and no account required.
    What happens to nested objects?
    They are flattened into dotted column names such as address.city. The nesting itself is not preserved in the tab file.
    How are arrays written?
    As JSON text inside a single cell, for example ["a","b"]. They are not spread across several columns.
    Why does the output start with an odd character?
    That is a UTF-8 byte-order mark, added so spreadsheet software reads the encoding correctly. Plain editors may display it as a stray symbol.
    Will my numbers stay numbers?
    No. A tab file stores text, so numeric values arrive as text. Converting back to JSON types short numbers as numbers and keeps leading-zero identifiers as strings.
    Can I choose a semicolon instead of a tab?
    Not on this page, which always writes tabs. The JSON to CSV route offers Comma, Semicolon and Tab as a Separator setting.

    Share this converter

    More sharing options