JSON to Markdown Converter

Paste any JSON — a notes backup, an API response, a config file — and get readable nested Markdown. Objects become headings and bullets; arrays of records become tables. Runs entirely in your browser, no upload, no sign-up.

Try:
Markdown

About this tool

JSON to Markdown renders an arbitrary JSON document — a notes-app export, an API response, a config file — as clean, nested Markdown. A top-level object's scalar keys become - **key**: value bullets and its nested objects and arrays become headings, starting at your chosen heading level and going one level deeper per nesting. A uniform array of flat objects becomes a GitHub-flavored table; other arrays become nested bullet lists. Everything runs in your browser — nothing is uploaded.

Worked example — a note object:

Input:

{"title":"My Note","pinned":true,"tags":["work","idea"],"meta":{"words":42,"created":"2026-07-31"}}

Markdown output (default settings):

- **title**: My Note
- **pinned**: true

## tags

- work
- idea

## meta

- **words**: 42
- **created**: 2026-07-31

Worked example — records become a table:

Input:

[{"name":"Ada","role":"Editor"},{"name":"Bob","role":"Reviewer"}]

Markdown output:

| name | role |
| --- | --- |
| Ada | Editor |
| Bob | Reviewer |

Set Array rendering to list to force nested bullets instead of a table, or table to force a table even for ragged or nested arrays (non-scalar cells become inline JSON).

Limits and edge cases

FAQ

How does an array of objects turn into a table?

Under the default auto mode, a uniform array whose objects hold only scalar values becomes a GitHub-flavored pipe table. The columns are the union of every object's keys, so rows with missing keys get blank cells. If any object contains a nested object or array, the whole array falls back to a nested bullet list instead — or you can set Array rendering to table to force a table anyway, in which case nested cells are rendered as inline JSON.

What happens to deeply nested JSON?

Nesting is expanded as headings and bullets up to Max nesting depth (default 6). Any subtree deeper than that limit is emitted verbatim inside a fenced json code block rather than being flattened further. Lower the limit to keep large documents compact, or raise it (up to 20) to expand everything.

Does it keep my key order, or sort them?

By default keys and table columns appear in the document's original order. Enable Sort keys alphabetically to order every object's keys and every table's columns alphabetically instead.

Is my JSON uploaded anywhere?

No. The conversion runs entirely in your browser through WebAssembly — the JSON you paste never leaves your machine, so it is safe for private notes, config, or API payloads.

Developer & Automation Access

Run it from the terminal

Same engine as this page, headless — via the gizza CLI:

gizza tool json-to-markdown '{"title":"My Note","pinned":true,"tags":["work","idea"]}'

New to the CLI? Get gizza →

Open it by URL

Pre-fill and auto-run this tool with query parameters — the names match the API/CLI:

https://gizza.ai/tools/json-to-markdown/?json=%7B%22title%22%3A%22My%20Note%22%2C%22pinned%22%3Atrue%2C%22tags%22%3A%5B%22work%22%2C%22idea%22%5D%7D&heading_level=2&array_mode=auto&sort_keys=true&max_depth=6

Machine-readable descriptor: tool.json — title + parameters JSON Schema for agents.