Skip to content

JSON to Markdown Table Converter

Paste a JSON array of objects (or arrays) and get a Markdown table as you type, with the keys as column headers.

Paste JSON

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

Converts as you type. Object keys become the header row.
Output
| id  | product             | category    | price  | inStock |
| --- | ------------------- | ----------- | ------ | ------- |
| 1   | Mechanical Keyboard | Hardware    | 129.99 | true    |
| 2   | Wireless Mouse      | Hardware    | 79.5   | true    |
| 3   | USB-C Hub           | Accessories | 45     | false   |
3 rows × 5 columns
Rendered Preview
idproductcategorypriceinStock
1Mechanical KeyboardHardware129.99true
2Wireless MouseHardware79.5true
3USB-C HubAccessories45false

How to convert JSON to a Markdown table in 3 steps

  1. Paste the JSON array

    Paste an array of objects such as [{"id": 1, "name": "A"}] into the Paste JSON box, or upload a .json file. An array of arrays works too, with the first array as the header, and so does an object that wraps a list, such as {"data": [...]}.

  2. Check the columns

    Every key becomes a column, in the order it first appears. Open Edit grid to rename headers, fix cells or set alignment, or use Tools › Auto-align for numbers.

  3. Copy the Markdown

    Click Copy Markdown and paste it into GitHub, GitLab, Obsidian or any Markdown file, or download it as .md.

Example

JSON array (different keys, nested, null)
[
  { "id": 1, "name": "Keyboard", "price": 129.99, "tags": ["usb", "rgb"], "inStock": true },
  { "id": 2, "name": "Mouse | wireless", "price": 79.50, "inStock": false },
  { "id": 3, "name": "USB-C hub", "price": null, "tags": [], "inStock": true }
]
Markdown table
| id  | name              | price  | tags          | inStock |
| --- | ----------------- | ------ | ------------- | ------- |
| 1   | Keyboard          | 129.99 | ["usb","rgb"] | true    |
| 2   | Mouse \| wireless | 79.5   |               | false   |
| 3   | USB-C hub         |        | []            | true    |

Options explained

Paste JSON box
Converts 150 ms after you stop typing, and immediately on paste. The badge shows the detected format; the status line shows rows × columns or what went wrong.
Upload file
Reads a file from your computer without uploading it anywhere. A .json file is parsed as JSON directly. CSV, TSV, HTML, Markdown, text and Excel files are accepted too..json · .csv · .tsv · .html · .md · .txt · .xlsx · .xls · .ods
Paste / Sample / Clear
Paste reads the clipboard, Sample loads an example array, Clear empties the box.
Edit grid / Markdown tabs
Rename headers, fix cells, set alignment or reorder columns after converting, with undo and redo. The Markdown tab shows the source.
Tools
Auto-align (numbers right, text left), header case, transpose, and quick or deep clean for stray spaces and blank rows.Auto-align · UPPER · lower · Title Case · Transpose · Quick clean · Deep clean
Flavor and Spacing
GFM suits GitHub, GitLab and most editors. Padded lines up the pipes in the source; Compact removes the padding; No outer pipes drops the leading and trailing |.GFM · MultiMarkdown · Pandoc Pipe · reStructuredText · Org-mode · Padded / Compact / No outer pipes
Collapsible <details>
Wraps a long table in <details><summary> so it starts collapsed on GitHub.
Output tabs, Download, Copy link
Switch the output to HTML, CSV, TSV, JSON, LaTeX, SQL or Jira. Download saves the active format, .xlsx, .csv or .png. Copy link stores the table after #md= in the URL, which browsers do not send to a server.

Convert other formats to Markdown

Convert Markdown to…

Browse all 36 tools

About this tool

Paste a JSON array and the Markdown table appears as you type, ready for a README, an API doc or a pull request. Each object is a row and each key a column; objects with different keys get a column per key, with empty cells where a key is missing. Nested objects become dot-notation columns such as address.city, arrays are written as compact JSON text, a wrapper like {"data": [...]} or a single object is unwrapped, and pipes in values are escaped. Invalid JSON gets an error with the line and column. Everything runs in your browser, so the JSON is never uploaded.

  • Array of objects: keys become the header row
  • Array of arrays: the first array is the header
  • Objects with different keys get a column per key; gaps stay empty
  • Nested objects become dot-notation columns (address.city); arrays stay compact JSON text
  • Wrapper objects like {"data": [...]}, single objects and JSON Lines are unwrapped
  • Invalid JSON shows the error with its line and column
  • Escapes | in values so columns never shift
  • Upload a .json file or paste an API response
  • Edit cells and alignment before copying
  • Runs in your browser; JSON is not uploaded

Technical details

How JSON is mapped to a Markdown table

The input is a JSON array, or an object that wraps one. Each element becomes a row, and the result is written as a GFM pipe table. Values are shown as text, not as JSON types, so the table reads the way the data would in a spreadsheet.

  • Array of objects: The columns are the union of all keys, in the order they first appear. An object without a key gets an empty cell.
  • Array of arrays: The first inner array is the header and the others are rows. Blank header cells are named “Column N” and short rows are padded.
  • Values: Strings, numbers and booleans are written as text. null becomes an empty cell, a nested object is flattened into dot-notation columns (address.city), and an array becomes compact JSON text such as ["usb","rgb"].
  • Numbers: They go through JavaScript, so 79.50 appears as 79.5, and integers beyond 9,007,199,254,740,991 lose precision. Quote such values as strings in the JSON to keep them exact.
  • Pipes: A | inside a value is written as \| so it does not create an extra column.
  • Other shapes: An object that holds one list of records ({"data": [...]}, {"count": 2, "items": [...]}) uses that list; any other single object becomes a Key / Value table; an array of plain values becomes one “Value” column; JSON Lines (one value per line) is read as an array.
  • Errors: Text that starts like JSON but does not parse shows “Invalid JSON”, the problem, and its line and column, instead of being read as CSV.

Tips and best practices

Wrapped responses work as they are

API responses often wrap rows in {"data": [...]} or {"items": [...]}. Paste the whole response; if it holds several lists, copy from the opening [ to the matching ] of the one you want.

Check flattened columns

A nested object becomes columns such as address.city. Arrays stay in one cell as JSON text; rename or delete columns in Edit grid.

Right-align numbers

JSON has no alignment, so every column starts left-aligned. Tools › Auto-align right-aligns the numeric columns.

Common problems and fixes

The table is full of braces, quotes and commas

Cause: The text was not read as JSON, for example because it is wrapped in a code block or has text before the opening [ or {. Invalid JSON that starts with [ or { shows an “Invalid JSON” error with a line and column instead.

Fix: Paste only the JSON, or fix the syntax the error points to, and paste again.

A single object gives a Key / Value table instead of one row

Cause: A single object that is not a wrapper around a list is read as Key / Value pairs, one per row.

Fix: Wrap the object in square brackets, [ { ... } ], to get one row with a column per key.

A price shows 79.5 instead of 79.50

Cause: JSON numbers are parsed as numbers, so trailing zeros are not kept.

Fix: Edit the cell in Edit grid, or store the value as the string "79.50" in the JSON.

Uploading a .json file shows “Invalid JSON”

Cause: A file ending in .json is always parsed as JSON, and it did not parse. The message gives the line and column.

Fix: Fix the syntax at that position. A file with one JSON object per line (NDJSON) is accepted as it is.

Platform compatibility

PlatformSupportNotes
GitHub & GitLab SupportedThe GFM output renders in READMEs, issues, PRs and wikis.
Obsidian SupportedRenders in Reading view and Live Preview.
API docs (MkDocs, Docusaurus) SupportedPipe tables render in both through their GFM table support.
Pandoc SupportedReads pipe tables with its pipe_tables extension, enabled by default for Pandoc Markdown.
CommonMark core ExtensionTables are not part of core CommonMark 0.31.2; the renderer needs a GFM table extension.

Frequently asked questions

How do I convert JSON to a Markdown table?

Paste a JSON array of objects into the box above, or upload a .json file. The Markdown table is generated as you type: object keys become the header row and each object becomes a row. Click Copy Markdown and paste it where you need it.

What JSON shapes does it accept?

An array of objects, such as [{"id": 1, "name": "A"}], or an array of arrays, where the first inner array is the header. An object that wraps a list, like {"data": [...]} or {"count": 2, "items": [...]}, uses that list. A single object becomes a two-column Key / Value table, an array of plain values becomes one column, and JSON Lines (one object per line) is read as an array.

What happens if objects have different keys?

The table gets one column for every key that appears anywhere, in the order each key first appears. An object that lacks a key gets an empty cell in that column.

How are nested objects and arrays handled?

A nested object is flattened into dot-notation columns such as address.city, up to eight levels deep. An array stays in one cell as compact JSON text, for example ["usb","rgb"].

Why does 79.50 show as 79.5?

JSON numbers are parsed as numbers, so trailing zeros are lost and integers beyond 9,007,199,254,740,991 lose precision. Put the value in quotes in the JSON ("79.50") to keep it exactly, or edit the cell in Edit grid.

Why is my table full of braces and quotes?

A table of braces and quotes usually means the text was not read as a JSON array, for example when it was pasted inside a code block or with a prefix. Text that starts with [ or { but is not valid JSON (a trailing comma, single quotes, an unquoted key) shows an “Invalid JSON” error with its line and column instead of a table.

How do I right-align number columns?

Click Tools › Auto-align to right-align columns that are mostly numbers, or open Edit grid and set alignment from a column’s ▾ menu. The delimiter row then uses ---: for those columns.

Is my JSON 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.