Skip to content

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.

Paste a Markdown table

Sample data shown — paste or drop your own to replace it.

Converts as you type. CSV, TSV, HTML and JSON are detected too.
Output
[
  {
    "Feature": "Unlimited Tables",
    "Free Tier": "Yes",
    "Pro ($12/mo)": "Yes",
    "Enterprise": "Yes"
  },
  {
    "Feature": "Custom Formatting",
    "Free Tier": "Basic",
    "Pro ($12/mo)": "Advanced",
    "Enterprise": "Full Suite"
  },
  {
    "Feature": "Team Sharing",
    "Free Tier": "No",
    "Pro ($12/mo)": "Up to 10",
    "Enterprise": "Unlimited"
  },
  {
    "Feature": "Priority Support",
    "Free Tier": "Community",
    "Pro ($12/mo)": "24h SLA",
    "Enterprise": "Dedicated Rep"
  }
]
4 rows × 4 columns
Rendered Preview
FeatureFree TierPro ($12/mo)Enterprise
Unlimited TablesYesYesYes
Custom FormattingBasicAdvancedFull Suite
Team SharingNoUp to 10Unlimited
Priority SupportCommunity24h SLADedicated Rep

How to convert a Markdown table to JSON in 3 steps

  1. 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.

  2. 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.

  3. Copy or download

    Click Copy JSON to paste it into code or a fixture, or open Download › JSON (.json) to save table.json.

Example

Markdown table
| 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 |
JSON output
[
  {
    "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 Markdown to…

Convert to Markdown from…

Browse all 36 tools

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

PlatformSupportNotes
JavaScript / TypeScript SupportedJSON.parse reads the output directly into an array of objects.
Python Supportedjson.loads reads it, and pandas.read_json turns it back into a DataFrame.
Mock APIs and fixtures SupportedValid 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.