{}JSONLint.app

JSON to Markdown Table

Convert JSON arrays to Markdown tables for documentation and README files:

About Markdown Tables

Markdown tables are a simple way to display tabular data in documentation, README files, GitHub issues, and other Markdown-compatible platforms.

Example Output

Given this JSON:

[
  {"name": "Alice", "role": "Admin", "active": true},
  {"name": "Bob", "role": "User", "active": false}
]

You get this Markdown:

| name | role | active |
|------|------|--------|
| Alice | Admin | true |
| Bob | User | false |

Which renders as:

nameroleactive
AliceAdmintrue
BobUserfalse

Supported JSON Structures

  • Array of objects — Most common, each object becomes a row
  • Nested values — Automatically stringified
  • Mixed types — Strings, numbers, booleans all supported

Column Alignment

Markdown supports column alignment using colons in the separator row:

| Left | Center | Right |
|:-----|:------:|------:|
| a    | b      | c     |

Use Cases

  • API Documentation — Document request/response formats
  • README files — Display configuration options
  • GitHub Issues — Present data clearly in tickets
  • Technical specs — List features or requirements
  • Database schemas — Document table structures

Limitations

  • Markdown tables don't support cell merging
  • No built-in sorting or filtering
  • Complex nested objects shown as JSON strings
  • Very wide tables may not render well

Related Tools

Common Mistakes & Pro Tips

  • Pipe characters in values must be escaped or they split the cellIn a Markdown table the pipe | is the column separator, so a value like a|b will be read as two cells and misalign the row. The fix is to escape it as a\|b. A correct converter escapes every literal pipe inside a value; if yours doesn't, any value containing | will corrupt the table layout.
  • Markdown tables require a flat array of objectsA GFM table is rows and columns of scalar text, so the input should be an array of objects with primitive values. Nested objects and arrays have no cell representation and are typically stringified (e.g. {"a":1} shown as JSON text) or flattened with dot-notation headers. Deeply nested JSON won't render as a clean table without flattening first.
  • Newlines inside a value break the table; use <br> insteadA literal line break inside a cell ends the table row in Markdown, so multi-line values must have their newlines replaced — commonly with a <br> tag, which renderers display as a line break inside the cell. Without this substitution, a value containing \n will split one row into several malformed lines. Check whether your converter does the replacement.
  • Headers are the union of all keys, and column order mattersThe header row is built from every key seen across all objects, so a field present in only some records still gets a column, with blank cells where it's absent. Column order usually follows first-seen order of keys. If two objects list the same keys in different orders, the converter normalizes them to one consistent column order — values are placed by key, not by position.
  • The separator row controls alignment, not just structureThe second row of dashes (|---|---|) is mandatory and also encodes alignment: :--- is left, :---: is center, and ---: is right. Some converters let you set alignment; plain output defaults to left. Pasting a table without that separator row makes most Markdown renderers show it as literal text rather than a formatted table.

Frequently Asked Questions

How do I convert a JSON array into a Markdown table?

Paste an array of objects and the tool builds a header row from the union of all keys, a separator row of dashes, and one table row per object. Values are escaped so pipes and newlines don't break the layout, producing GitHub-Flavored Markdown you can paste into a README, issue, or wiki. Copy the result and it renders as a formatted table anywhere GFM tables are supported.

Why do values with a | symbol break my table?

The pipe is Markdown's column delimiter, so an unescaped | inside a value is interpreted as a new cell boundary and shifts the whole row. The converter escapes literal pipes as \| so they display as text instead. If you edited the output by hand and a row looks misaligned, check for an unescaped pipe in one of its cells.

How are nested objects or arrays shown in a Markdown table?

Because a table cell holds plain inline text, nested objects and arrays are serialized into the cell as a compact JSON string, or their keys are flattened into separate dot-notation columns like user.name. They are not expanded into additional rows. For readable tables, flatten the JSON to one level of scalar fields before converting.

Can I include multi-line text inside a cell?

A raw newline would terminate the table row, so multi-line content needs its line breaks converted to <br> tags, which Markdown renders as line breaks within the cell. Most converters do this substitution automatically when a value contains a newline. The cell then displays on multiple visual lines while keeping the table structure intact.

What Markdown flavor does the output target?

Tables are a GitHub-Flavored Markdown (GFM) extension, not part of the original CommonMark spec, so the output renders on GitHub, GitLab, Reddit, and most modern Markdown engines. Older or strict CommonMark-only renderers may show the table as literal pipes and dashes. If your destination doesn't render tables, it likely doesn't support the GFM table extension.

Is my data processed locally?

Yes, the JSON is parsed and the Markdown is generated in your browser, so nothing is uploaded or stored remotely. You can safely convert internal data you intend to paste into a private repo or document. The output lives only in your session until you copy it.