Skip to content
DevToolsCave

    This tool runs entirely in your browser. Nothing you paste is uploaded.

    How you can check →
    JSON

    JSON to CSV

    Turn an array of JSON objects into a CSV you can open in a spreadsheet. Nested fields flatten into dotted columns, and long numbers keep every digit.

    CSV
    The CSV appears here.

    What this converter does

    CSV is a grid: every row has the same columns, and every cell holds one value. JSON is a tree, and can nest to any depth. Converting one to the other therefore means deciding how a tree becomes a grid, and most of the difficulty is in the cases where that decision is not obvious. This page states its rules rather than hiding them.

    Flattening

    Each element of the top-level array becomes one row. A nested object contributes a column per leaf, joined with dots — user.address.city. An array contributes a column per item, with a bracket index — tags[0], tags[1]. Empty objects and arrays are written as {} and [] rather than as blank cells, so "present but empty" stays distinguishable from "not there". Turn flattening off and a nested value is written as compact JSON inside a single cell instead, which is what you want when the nested part is data you plan to parse again later rather than read.

    Columns

    The header is the union of every field name across every row, in the order each was first seen. This matters more than it sounds: real exports frequently have optional fields that appear for the first time thousands of rows in, and a converter that takes its columns from row one drops them without a word.

    Quoting

    A field is quoted when it contains the delimiter, a double quote, a line break, or leading or trailing spaces; quotes inside are doubled, per RFC 4180. Fields that need no quoting do not get any, which keeps the output readable and diff-friendly.

    Numbers keep their digits

    Values are written from the original text of your JSON, not from a JavaScript number. A 19-digit order ID or a high-precision decimal is copied across character for character. Any converter that parses to a native number first will round these — quietly, and in a way you will not notice until the IDs stop matching.

    Spreadsheet gotchas worth knowing

    • A cell starting with =, +, - or @ is treated as a formula by Excel and Sheets. This tool warns rather than altering your values.
    • Excel needs a byte-order mark to read UTF-8 correctly on some platforms; the BOM option adds one. Leave it off for anything you will process with code.
    • RFC 4180 specifies CRLF line endings, which is the default. Switch to LF if the file is headed for Unix tooling.
    • Long numeric strings such as zero-padded codes may still be reformatted by the spreadsheet itself on opening — that is Excel, not the conversion.

    Frequently asked questions

    How are nested objects turned into columns?
    Nested properties become dotted column names and array items become bracket indices, so {"user":{"name":"Ada"},"tags":["x"]} produces the columns user.name and tags[0]. That naming round-trips: feeding the CSV back through the CSV to JSON converter rebuilds the same shape.
    What if my rows do not all have the same fields?
    The header is the union of every field seen across every row, in first-seen order, and a row missing a field gets an empty cell. Taking the columns from the first row alone is the classic bug in this conversion — it silently drops any field that only appears later in the file.
    Will my long ID numbers survive?
    Yes. Numbers are written using the exact digits from your JSON rather than being read into a JavaScript number first, so a 20-digit Snowflake ID or bigint primary key comes out unchanged. Most converters round these silently.
    Why does it warn about cells starting with = or +?
    Excel and Google Sheets evaluate a cell beginning with =, +, - or @ as a formula, which is the basis of CSV injection attacks. This tool writes your values through unchanged rather than altering your data, and warns you so you can decide before opening the file in a spreadsheet.
    Does my data get uploaded?
    No. The conversion runs entirely in your browser, and the Download button writes a file directly from the page. Nothing is transmitted, stored or logged, so this is safe for production data.