json → ini · sections · scalars · ini package · live

Convert JSON to INI

Serialise a JSON object as a classic INI / config file. Nested objects emit as [section] headers, scalar values become key=value pairs. Powered by the npm ini package, loaded on demand.

JSON → INI
Input
100 B
4 lines
Output
0 B
1 lines
Status
loading
parser…
Ratio
0.00×
out/in
input · json
output · ini
Loading parser…
Quick Start

How JSON becomes INI

The ini package walks the JSON tree. Top-level scalars sit above any section header; each nested object emits as a [section]; arrays render as repeated key entries. The output is interoperable with most INI parsers.

  1. 01

    Paste JSON

    Root must be an object — INI has no concept of a top-level array.

    Parsing runs through Prettier’s standalone bundle (or the language-specific equivalent) loaded lazily — no parser ships until the tool is opened.

    inputPrettierASTstandalonelazy
    in · sourcejson · AST
    { "db": { "host": "localhost" } }
    loaded · parsedAST · ready
  2. 02

    Loader lazy-imports

    The ini parser package is split out of the main bundle and loaded the first time you visit.

    Indent width, tab style, and print-width re-format through a memoised pass — switching 2 → 4 spaces never re-parses, only re-prints.

    loadindentprint-widthmemoisedlive
    import · optionsini · live
    await import("ini")
    options applied · livelive
  3. 03

    Sections emitted

    Each nested object becomes a [section] header with its scalars below.

    The formatter is deterministic and idempotent: running it twice produces byte-identical output, which keeps diffs and git noise to a minimum.

    sectionsidempotentdeterministicdiff-cleanstable
    obj · formatted[section] · ready
    [db]
    host = localhost
    formatted · liveidempotent
  4. 04

    Copy or download

    Save as .ini or .conf — drop into systemd, PHP, Git config and friends.

    Download writes a Blob with the language-appropriate extension; copy uses navigator.clipboard.writeText so the output preserves all whitespace exactly.

    exportclipboardbloblanguage MIMEclient-side
    ✓ · copiedready · done
    ✓ Copied
    shipped · ready to shipsuccess
Pro tips

Formatting tips that keep diffs sane

Pick one config and pin it

Inconsistent formatting causes diff churn. Commit .prettierrc / .editorconfig and enforce in CI.

Format on save

Editor integration is faster feedback than a pre-commit hook. Use both for belt-and-braces.

Idempotency matters

Running the formatter twice should produce identical output. Test this on a representative file.

Match the language community

Default to community conventions: 2 spaces for JS/CSS, 4 for Python, tabs for Go. Fights over indent are a productivity tax.

Print-width drives wrapping

80, 100, and 120 are the common targets. Wider lines parse fast but review slower side-by-side.

Don’t mix formatters and linters

Prettier handles whitespace; ESLint handles correctness. Disable overlapping rules to avoid fight-club configs.

Use Cases

When to convert JSON to INI

systemd, Git, legacy tooling.

systemd units

Generate a .conf file from a JSON service description. Idempotent: running the formatter twice produces byte-identical output, which is the foundation of a clean CI gate. Pair with a pre-commit hook so PRs arrive already formatted, focusing review on logic.

idempotent

Git config

Render a JSON-shaped repo config as INI for git config --file. Pairs with EditorConfig + .prettierrc for end-to-end consistency. Whitespace-only changes vanish so reviewers see real diffs, and git blame stays honest about who wrote what.

CI-ready

PHP / WordPress

Many legacy PHP tools expect INI configuration files. Output respects your indent width, tab style, and print-width — settings carry over for repeat runs. Switching 2-space to 4-space costs nothing in CPU but standardises an entire codebase.

diff-clean

Python configparser

Hand a JSON config to a Python script that uses configparser. Format-on-save is the fastest feedback loop; CI is the safety net. Together they make inconsistent indentation a thing of the past and free up review cycles for genuine concerns.

PR-friendly

Migrations

Move JSON snapshots back into a deployment that prefers INI. Whitespace-only changes don't trigger downstream content-hash invalidations, so CDN cache keys and CI cache layers stay warm. Real changes get all the rebuild budget.

review-ready

Docs samples

Show INI examples generated from canonical JSON sources. Pairs with linters (ESLint, Stylelint, pylint) that catch what formatting alone can't — bugs, unused imports, dead code. Each tool stays in its lane, and the codebase stays clean.

deterministic
FAQ

Frequently asked questions

INI only has a single level of sections. Deeper nesting flattens into dotted section names (e.g. [database.replicas]).
Arrays emit as repeated key entries (key[]=a, key[]=b) which the ini package understands on round-trip.
The ini package doesn't emit comments. Add them by hand after pasting.
We code-split the parser so the page itself stays light. Status flips from 'loading' to 'live' once it's ready.
No. The parser runs locally once it's loaded.
Suggest a tool

Something missing?

Tell us what you need. We ship the top requests every two weeks.

Sent straight to the maintainers · no account needed
47 in queue·8 shipped this month
Request queued. Thanks!