json:yaml

YAML to JSON converter

Paste YAML, get JSON. Anchors are expanded, block scalars become escaped strings, and comments are dropped — because JSON has nowhere to put them.

YAML
JSON

      
Paste YAML to convert.

Conversion happens in this browser tab. Nothing is uploaded, logged, or stored.

How the conversion works

This direction is the harder one. YAML has features JSON simply does not have, so the converter has to decide what to do with them rather than copy them across.

YAML featureWhat happens in JSON
Comments (#)Dropped. JSON has no comment syntax.
Anchors and aliases (&x, *x)Expanded — the referenced value is written out in full at every use.
Multi-document files (---)Only the first document is converted. The YAML validator will show you how many there are.
Block scalars (|, >)A single JSON string with escaped newlines; see block scalars.
Non-string keys (1: value)Coerced to strings. JSON keys are always strings.
Explicit tags (!!timestamp)Resolved to a plain value where possible.

Comments being dropped is the loss that surprises people most. If your YAML is documentation as much as configuration — and a well-written values.yaml usually is — round-tripping through JSON strips that documentation permanently. Keep the YAML as the source of truth and treat the JSON as a build artifact.

Anchors, expanded

Aliases are the clearest illustration of what "lossy" means here. The YAML on the left defines a block once and reuses it. The JSON on the right has no way to say "the same as above", so the block is repeated.

config.yaml
defaults: &defaults
  retries: 3
  timeout: 30

staging:
  <<: *defaults
  host: stg.example.com

production:
  <<: *defaults
  host: example.com
config.json
{
  "defaults": { "retries": 3, "timeout": 30 },
  "staging": {
    "retries": 3,
    "timeout": 30,
    "host": "stg.example.com"
  },
  "production": {
    "retries": 3,
    "timeout": 30,
    "host": "example.com"
  }
}

The JSON is correct and equivalent. It is also three times longer and no longer carries the intent that staging and production share a base. Converting back will not restore the anchors.

Doing the same thing in code

Python

import json, yaml

with open("config.yaml") as f:
    data = yaml.safe_load(f)          # safe_load, never load()

print(json.dumps(data, indent=2))

Use safe_load. Plain yaml.load() can construct arbitrary Python objects from a crafted document, which is a remote code execution path if the YAML came from anywhere you do not control.

Node.js

import fs from "node:fs";
import yaml from "js-yaml";

const data = yaml.load(fs.readFileSync("config.yaml", "utf8"));
console.log(JSON.stringify(data, null, 2));

Multiple documents in one file

# Python — a list of documents
docs = list(yaml.safe_load_all(open("manifests.yaml")))
print(json.dumps(docs, indent=2))

# Command line
yq -o=json '.' manifests.yaml

Errors you are likely to hit

Tabs used for indentation

YAML forbids tabs as indentation, full stop. An editor configured to insert tabs will produce a file that looks perfectly aligned and fails to parse. Set your editor to two spaces for .yml and .yaml.

Missing space after the colon

key:value is a single scalar string, not a mapping. YAML needs key: value. This one is easy to miss because most languages accept the compact form.

The value looks like something else

An unquoted 1.10 becomes the float 1.1, losing the trailing zero. An unquoted 3:00 can parse as a sexagesimal number under YAML 1.1. Version strings, times, and anything with a leading zero want quotes.

A colon inside an unquoted value

message: Error: not found is ambiguous and most parsers reject it. Quote the whole value: message: "Error: not found".

If you are staring at a parser error right now, the YAML error reference lists the common messages verbatim with the fix for each.

Nothing leaves this tab

The YAML people paste here is usually a values.yaml, a CI pipeline definition, or an Ansible playbook — files that sit in private repositories and name every host, queue, and service account an organisation runs. Even with the secrets templated out, the structure alone maps your infrastructure.

None of it reaches us. Parsing and conversion happen locally, in JavaScript, on your machine. We could not produce your document if someone asked us to, because we never received it.

Questions people ask

What happens to my comments?
They are dropped. JSON has no comment syntax, so there is nowhere for them to go. This is the main reason to keep YAML as your source of truth and treat JSON as a generated artifact.
What happens to anchors and aliases?
They are expanded. Every place an alias was used gets a full copy of the referenced value. The JSON is equivalent but longer, and converting back will not restore the anchors.
My file has several documents separated by ---. What happens?
Only the first document is converted. To get all of them as a JSON array, use yaml.safe_load_all in Python or yq -o=json '.' on the command line.
Why is my version number wrong after converting?
An unquoted 1.10 in YAML is the float 1.1, so the trailing zero is gone before JSON is ever written. Quote version strings in the YAML source.
Is yaml.load() safe to use?
Not on input you did not write. It can construct arbitrary Python objects from tags in the document, which is a code execution path. Use yaml.safe_load instead.
Is my YAML uploaded to a server?
No. Parsing and conversion happen in your browser tab. Nothing is transmitted.