Tools · Markdown

JSON to Markdown table

Rows in, a pipe table out — and a pipe table in opens as rows without a question, because its second line is the whole signature.

no signup · runs entirely in your browser · ⌘V works anywhere on this page
See it done · 10 s
JSON to a Markdown table — An order opened as a tree, Convert, Markdown: the main list is the rows, the rest of the document on every row, nested keys as dotted columns. · 10 s

What you get

  • Convert → Markdown writes a pipe table from any rows: a JSON array of objects, a CSV, NDJSON, a log read as records
  • A list of objects is one row each. An object with a list inside — an order with its items — is one row per item, with the rest of the object on every row and nested keys as dotted columns (customer.id, items.sku), the way pandas normalizes it. Focus a branch in the tree and only it converts — “rows from $.items”
  • Escapes a | in a cell and writes a newline as <br>, so the table survives a Markdown renderer
  • Opens a pasted pipe table straight as rows — “6 rows · read as a Markdown table” — and converts on to CSV, JSON or NDJSON
  • Keeps the column order: the first row’s keys as written, then any key a later row adds

What it will not do

  • Render Markdown. It writes the table text; your README renders it.
  • Write alignment colons. A table it writes uses plain --- rules under the header.
  • Make a table out of a document with no list in it — that is refused with the reason, not padded into one row.

What becomes a row

A list of objects → one row each
[{"sku":"A","qty":1},{"sku":"B","qty":2}]| sku | qty | | --- | --- | | A | 1 | | B | 2 |
One object → one row
{"id":"ord_1","status":"paid"}| id | status | | --- | --- | | ord_1 | paid |
A nested object → dotted columns
{"id":1,"customer":{"name":"Rin"}}| id | customer.name | | --- | --- | | 1 | Rin |
The main list is the rows; the rest rides on every row
{"order":"ord_1","items":[{"sku":"A"},{"sku":"B"}]}| order | items.sku | | --- | --- | | ord_1 | A | | ord_1 | B |
A pipe in a cell

Written as \| so the table keeps its columns.

The sample

What the first sample opens — a real file, not an illustration written for this page.

kibana-export.md
| @timestamp | level | service | message | duration_ms |
|---|---|---|---|---|
| 2026-04-21T14:32:08Z | INFO | checkout-api | stripe.charge.completed | 88 |
| 2026-04-21T14:32:07Z | WARN | checkout-api | retry.scheduled attempt=2 | 400 |
| 2026-04-21T14:32:07Z | ERROR | checkout-api | stripe.webhook.signature_invalid | 12 |
| 2026-04-21T14:32:07Z | INFO | checkout-api | cart.items.priced items=2 | 51 |
| 2026-04-21T14:32:06Z | INFO | auth-svc | session.token.issued ttl=3600 | 9 |
| 2026-04-21T14:32:05Z | ERROR | inventory | inventory.hold.failed sku=BRD-OAK-002 | 130 |

in VS Code

Convert, then Markdown table — from a document, a selection or a rows file, into a new editor.

unstringify for VS Code14-day trial · Free and Pro

Questions

Which JSON becomes a table?

An array of objects is one row each, keys as columns. An object is read the way pandas normalizes it: its main list of records becomes the rows and the rest of the object repeats on every row, nested keys as dotted columns (customer.id, items.sku); an object with no list is one row. Focus a branch in the tree to convert that branch alone.

Can I convert a Markdown table to CSV or JSON?

Yes. Paste the table; it opens as rows with no question asked, and Convert offers CSV, JSON, NDJSON, YAML and XML.

Does the table keep my column order?

Yes — the keys of the first row in the order they appear, then any key a later row adds, at the end.

What about a cell with a pipe in it?

It is escaped as \|, so the column count holds when the table is rendered.

Try it on the file that broke your afternoon.

free · no signup