Paste or upload JSON
Add a JSON array of objects to the input panel. Each object becomes a table row with its keys as columns.
Convert JSON arrays into Markdown tables for README files, wikis, and documentation. Choose column alignment, bold headers, and code block wrapping. Output follows GitHub Flavored Markdown and works on GitHub, GitLab, Notion, and Confluence, all client-side.
Tables are not part of the original Markdown specification. They come from GitHub Flavored Markdown, which is now the de facto standard and is implemented by essentially every modern Markdown renderer. The syntax has exactly three parts.
Leading and trailing pipes on each line are optional, though including them makes the table far easier to read in raw form and avoids ambiguity when a cell is empty. A blank line before and after the table is required, since without it the table can be absorbed into a neighbouring paragraph.
A release changelog rendered as a Markdown table.
JSON input
Markdown output
The pipe inside the first summary is escaped with a backslash. That single character is the difference between a working table and a mangled one.
Colons placed in the separator row control how each column is aligned. This is the only formatting control the syntax offers, and it is worth using, because right aligned numbers are much easier to scan.
| Separator cell | Alignment | Use for |
|---|---|---|
| --- | Default, which renders as left | Anything unspecified |
| :--- | Explicit left | Text, names, descriptions |
| ---: | Right | Numbers, currency, counts, dates |
| :---: | Centre | Status ticks, short flags, icons |
Alignment in practice
The separator row must have the same number of cells as the header row. A mismatch is the second most common reason a table silently renders as a paragraph of pipes.
The pipe is the cell delimiter, so a literal pipe inside cell content splits the cell in two and shifts every value after it. This is by far the most frequent breakage, and it is common precisely because pipes appear in real data: shell commands, regular expression alternations, union types, and the joined array values that other converters produce.
| Raw content | Written in the cell | Renders as |
|---|---|---|
| a | b | a \| b | a | b |
| cat file | grep x | cat file \| grep x | cat file | grep x |
| string | null | string \| null | string | null |
| `a | b` in code span | `a \| b` | Escaping is still needed inside backticks |
That last row surprises people. A code span does not protect a pipe inside a table cell, because the table is parsed into cells before inline code spans are processed. Escape it anyway. An alternative for content full of pipes is the HTML entity |, which most renderers pass through unharmed.
A Markdown table cell holds inline content only. Bold, italic, links, images, and code spans all work. Block level content does not: no lists, no headings, no multiple paragraphs, no nested tables, no fenced code blocks.
The line break workaround
A break tag gives you multiple lines inside a cell on renderers that allow inline HTML, which covers GitHub, GitLab, and most static site generators. It does not work everywhere: renderers with HTML disabled for security will show the tag literally. There is also no way to merge cells, since Markdown has no equivalent of colspan or rowspan.
When a table genuinely needs block content, the answer is to write it as an HTML table inside the Markdown document. Most renderers pass raw HTML through, and you get the full expressive range at the cost of a much noisier source file.
| Destination | Table support | Notes |
|---|---|---|
| GitHub README and issues | Full GFM | Alignment and inline HTML both work |
| GitLab and Gitea | Full GFM | Behaves the same as GitHub in practice |
| Notion | On paste | A pasted Markdown table becomes a native table block |
| Obsidian | Full | Live preview and a built-in table editor |
| Jekyll, Hugo, Astro, Docusaurus | Full | Styled by the site theme |
| Slack | None | Slack does not render Markdown tables, use a code block |
| Plain Markdown viewers | Varies | Tables are an extension, not core Markdown |
One last thing that puzzles newcomers: column widths in the source do not need to line up. The parser only cares about pipes and the separator row, so a table with ragged source columns renders identically to a beautifully aligned one. Many editors auto-format tables to align on save because it is much easier for a human to read and to diff, but it is purely cosmetic.
Documentation tables often start life somewhere else. See the full converter collection for JSON to HTML table when you need a styled web table, JSON to CSV when the same rows belong in a spreadsheet, and CSV to JSON when a colleague sends the data back the other way.
Add a JSON array of objects to the input panel. Each object becomes a table row with its keys as columns.
Pick column alignment (left, center, right), toggle bold headers, or wrap the output in a code block.
The Markdown table updates live. Copy it or download a .md file.
Turn API responses, config lists, and data exports into clean Markdown tables for your README, wiki, or changelog in seconds.
No upload, no server. All conversion happens in your browser.
Markdown output updates as you type or change formatting options.
Output follows GitHub Flavored Markdown for perfect rendering on GitHub and GitLab.
Left, center, or right column alignment with standard separator syntax.
Nested objects and arrays are serialised to inline JSON strings in cells.
Export a ready-to-use Markdown file with your table.
This tool generates standard Markdown pipe table syntax from JSON arrays. Keys are collected from all objects in the array and used as column headers. Cells with pipe characters are automatically escaped. Boolean, number, and null values are rendered as plain text. Nested objects and arrays are serialised to compact JSON strings. The output follows the GitHub Flavored Markdown specification and renders in any GFM-compatible renderer.