Markdown Table to JSON Converter
Paste a Markdown table and copy a JSON array of objects, with the headers as keys and plain numbers, true/false and null as typed values.
Sample data shown — paste or drop your own to replace it.
How to convert a Markdown table to JSON in 3 steps
Paste the Markdown table
Paste it into the Paste Markdown box (CSV, TSV and HTML tables are detected too), or upload a file. If the text holds several tables, the first one is converted.
Check the JSON
The JSON tab on the right is already selected and updates as you type. Each row is one object. Use Edit grid to rename headers, since they become the keys.
Copy or download
Click Copy JSON to paste it into code or a fixture, or open Download › JSON (.json) to save table.json.
Example
| id | Product name | price | in stock | notes | | ---: | :--- | ---: | :---: | :--- | | 1 | Keyboard | 129.99 | yes | "ISO" layout | | 2 | Mouse \| wireless | 79.50 | no | | | 3 | USB-C hub | 12 | yes | 4 ports<br>1 HDMI |
[
{
"id": 1,
"Product name": "Keyboard",
"price": 129.99,
"in stock": "yes",
"notes": "\"ISO\" layout"
},
{
"id": 2,
"Product name": "Mouse | wireless",
"price": 79.5,
"in stock": "no",
"notes": ""
},
{
"id": 3,
"Product name": "USB-C hub",
"price": 12,
"in stock": "yes",
"notes": "4 ports<br>1 HDMI"
}
]Options explained
- Paste Markdown box
- Converts 150 ms after you stop typing, and immediately on paste. The badge shows the detected format. Only the first table in the text is used.
- Upload file
- Reads a .md, .csv, .tsv, .json, .html, .txt or Excel file from your computer without uploading it anywhere..md · .csv · .tsv · .json · .html · .txt · .xlsx · .xls · .ods
- Paste / Sample / Clear
- Paste reads the clipboard, Sample loads an example Markdown table, Clear empties the box.
- Edit grid / Markdown tabs
- Rename headers (the JSON keys), fix cells or reorder columns, with undo and redo. The Markdown tab shows the source and stays in sync.
- Tools
- Header case (UPPER, lower, Title Case), transpose, and quick or deep clean for stray spaces and blank rows. Header case changes the keys.UPPER · lower · Title Case · Transpose · Quick clean · Deep clean
- Output tabs
- This page opens on JSON. The same table can be switched to Markdown, HTML, CSV, TSV, LaTeX, SQL or Jira. The JSON shape is fixed as an array of objects. The Infer types checkbox above the output is on by default on this page.JSON (selected) · Markdown · HTML · CSV · TSV · LaTeX · SQL · Jira
- Copy JSON
- Copies exactly what the output box shows, indented with two spaces.
- Download
- Saves the JSON as table.json, or the table as an Excel workbook (.xlsx), a CSV file or a PNG image..json · .xlsx · .csv · .png
- Copy link
- Copies a URL that reopens this table. The table is stored after #md= in the link, which browsers do not send to a server.
Convert to and from other formats
Also useful
Convert Markdown to…
- Markdown Table to CSVExport a Markdown table as RFC 4180 CSV.
- Markdown Table to TSVCopy as tab-separated values that paste cleanly into Excel and Sheets.
- Markdown Table to HTMLExport semantic <table> markup.
- Markdown Table to LaTeXExport LaTeX tabular code for papers and Overleaf.
- Markdown Table to SQLGenerate CREATE TABLE and INSERT statements.
- Markdown Table to ExcelDownload a real .xlsx with numbers, bold header and one sheet per table.
- Markdown Table to Google SheetsCopy a table that pastes cleanly into Google Sheets.
- Markdown Table to WordCopy a formatted table into Word or Google Docs, or download .docx.
- Markdown Table to ConfluenceWiki markup, storage format or a rich copy for the Cloud editor.
- Markdown Table to JiraConvert to Jira and Confluence wiki markup.
- Markdown Table to ImageRender the table as a PNG or SVG for slides and posts.
Convert to Markdown from…
- CSV to Markdown TableConvert CSV text or .csv files, including quoted cells.
- Excel to Markdown TablePaste cells copied from Excel straight into a Markdown table.
- Google Sheets to Markdown TablePaste a copied range or a public sheet URL.
- TSV to Markdown TableConvert tab-separated text into a Markdown table.
- HTML Table to MarkdownConvert <table> markup into a Markdown table.
- JSON to Markdown TableConvert a JSON array of objects into a table.
- SQL to Markdown TableConvert MySQL, PostgreSQL or SQLite CLI query output.
- Word Table to MarkdownPaste a table copied from Word or Google Docs.
- Web Table to MarkdownCopy a table from any web page and paste it here.
- Image to Markdown TableTurn a screenshot or photo of a table into Markdown in your browser.
- PDF to Markdown TableExtract a table from a PDF page, with OCR for scans.
- Universal Table to MarkdownPaste anything tabular; the format is detected for you.
About this tool
Paste a Markdown table and the JSON appears as you type: an array with one object per row, using the header text as the keys, indented with two spaces. Plain numbers, true, false and null are written as JSON numbers, booleans and null (so 12 becomes 12 and 007 stays “007”), everything else is a string, and empty cells become “”. Untick Infer types above the output to get strings only. Keys are used exactly as the headers are written, so rename a header like “Product name” first if you want product_name. Everything runs in your browser.
- Array of objects: header text becomes the key
- Infer types: plain numbers, true/false and null are written as JSON values
- A __proto__ or constructor column keeps its key
- Output is valid JSON, indented with two spaces
- Quotes, backslashes and Unicode escaped correctly
- Duplicate headers get _2, _3; blank headers become col_N
- Markdown \| is written as a plain |
- Edit headers and cells before exporting
- Runs in your browser; the table is not uploaded
Technical details
How the JSON is built
The first Markdown table in the text becomes a JSON array with one object per row. Keys are the header cells, in column order, and the output is produced with JSON.stringify and a two-space indent, so quoting and escaping are always valid.
- Keys: The header text is used exactly as written, including spaces and capitals (“Product name”). It is not converted to camelCase or snake_case; rename the header first if you need that.
- Duplicates and blanks: A repeated header becomes name_2, name_3 and so on, and a blank header becomes col_1, col_2 by position.
- Types: With Infer types on (the default here), a cell that is exactly true, false, null or a plain number is written as that JSON value: 12 becomes 12 and 79.50 becomes 79.5. Values that would lose information stay strings: 007, +5, 1,234, numbers beyond 15 significant digits or 2^53, and words like yes. Untick Infer types for strings only.
- Empty cells: An empty cell becomes "" (an empty string), not null; type null in the cell for a JSON null.
- Line breaks: A <br> in a Markdown cell stays as the characters <br> inside the string.
- Inline Markdown: **bold**, `code` and [links](https://example.com) are kept as typed.
- Alignment: Column alignment from the delimiter row is not part of the JSON.
Tips and best practices
Name the headers like the keys you want
Rename headers such as “Product name” to product_name or productName in Edit grid before copying, so the keys are ready to use in code.
Convert numbers in your code
Infer types writes numbers as numbers, but a column that mixes numbers and text (such as 12 and n/a) gets both types. Clean such columns first, or untick Infer types and convert where you load the JSON.
Validate before you ship it
The output is valid JSON. If it goes into a config or API fixture, still run it through your own schema check, because types are guessed from each cell.
Common problems and fixes
Numbers are quoted ("12") and I wanted 12
Cause: Infer types is unticked, or the value is not a plain number (007, +5, 1,234, 12 kg), so it stays a string.
Fix: Tick Infer types and clean the value in Edit grid, or convert the fields after loading the JSON.
Keys contain spaces or capitals
Cause: Header text is used as the key unchanged.
Fix: Rename the headers in Edit grid (or use Tools › header case) before copying.
Empty cells became "" and I wanted null
Cause: Empty cells are exported as empty strings.
Fix: Type null in those cells (with Infer types on), or handle empty strings when you read the data.
Only the first table was exported
Cause: The converter reads one table at a time.
Fix: Paste each table separately.
Platform compatibility
| Platform | Support | Notes |
|---|---|---|
| JavaScript / TypeScript | Supported | JSON.parse reads the output directly into an array of objects. |
| Python | Supported | json.loads reads it, and pandas.read_json turns it back into a DataFrame. |
| Mock APIs and fixtures | Supported | Valid JSON, so it can be saved as a .json fixture; numbers are typed only when Infer types is on. |
Frequently asked questions
How do I convert a Markdown table to JSON?
Paste the Markdown table into the box above. The JSON tab on the right is already selected and updates as you type. Click Copy JSON, or open Download › JSON (.json) to save table.json. Each row becomes an object and the headers become its keys.
Why are my numbers in quotes?
They should not be: with Infer types ticked (the default on this page) a cell that is a plain number is written as a JSON number, so 12 becomes 12 and 79.50 becomes 79.5. Values that would lose information stay strings: 007, +5, 1,234 and numbers with more than 15 significant digits. If Infer types is unticked, every value is a string.
Can I get an array of arrays instead of objects?
Not on this page: the JSON shape is always an array of objects. Paste the result into your editor and reshape it, or use the CSV tab if you need plain rows.
How are the keys chosen?
The header text is used exactly as written, including spaces and capitals. A repeated header becomes name_2, name_3 and so on, and a blank header becomes col_1, col_2 by position. Rename headers in Edit grid first if you need camelCase or snake_case.
What happens to empty cells?
They become empty strings (""), not null. Type null in the cell for a JSON null (with Infer types on), or treat empty strings as missing when you read the data.
What happens to <br>, bold and links in cells?
They are kept as typed inside the string: <br> stays the characters <br>, and **bold** and [text](https://example.com) are not converted. Remove them in Edit grid first for plain values.
Does it handle several tables or a whole README?
Only the first table in the pasted text is converted, and the rest is ignored. Paste each table separately to export the others.
Is my table uploaded anywhere?
No. Parsing and conversion run in your browser. A draft is saved in your browser’s local storage so a reload does not lose it, and Copy link puts the table after #md= in the URL, which browsers do not send to a server.