rtro.dev/tools/json

JSON, YAML and TOML formatter, converter and diff

Runs entirely in your browser. Nothing you paste is sent anywhere, so config files and tokens stay on your machine.
Input
1 line · 3.4 KB
1
Minified · 3,466 charsJSON
OutputValid JSON
1{
2 "board": {
3 "actions": [
4 {
5 "due": "2026-10-08",
6 "owner": "Priya",
7 "text": "Add a smoke test for payments",
8 "tracker": "LIN-2291"
9 },
10 {
11 "due": "2026-10-15",
12 "owner": "Jonas",
13 "text": "Rotate the release captain",
14 "tracker": null
15 }
16 ],
17 "closedAt": null,
18 "columns": [
19 {
20 "cards": [
21 {
22 "author": "Ana",
23 "createdAt": "2026-09-17T09:00:00Z",
24 "id": "crd_007f0",
25 "text": "Pairing cut review time in half",
26 "votes": 0
27 },
28 {
29 "author": "Tomás",
30 "createdAt": "2026-09-18T10:13:00Z",
31 "id": "crd_017f37",
32 "text": "Feature flags made the rollout calm",
33 "votes": 3
34 },
35 {
36 "author": "Priya",
37 "createdAt": "2026-09-19T11:26:00Z",
38 "id": "crd_027f74",
39 "text": "On-call handover doc finally exists",
40 "votes": 6
41 },
42 {
43 "author": "Jonas",
44 "createdAt": "2026-09-20T12:39:00Z",
45 "id": "crd_037f14",
46 "text": "Design review happened before build",
47 "votes": 2
48 },
49 {
50 "author": "Mei",
51 "createdAt": "2026-09-21T13:52:00Z",
52 "id": "crd_047f51",
53 "text": "Fewer meetings on Wednesdays",
54 "votes": 5
55 },
56 {
57 "author": "Kwame",
58 "createdAt": "2026-09-22T14:05:00Z",
59 "id": "crd_057f88",
60 "text": "Flaky test dashboard helped",
61 "votes": 1
62 },
63 {
64 "author": null,
65 "createdAt": "2026-09-23T15:18:00Z",
66 "id": "crd_067f28",
67 "text": "Customer call notes in the ticket",
68 "votes": 4
69 },
70 {
71 "author": null,
72 "createdAt": "2026-09-24T16:31:00Z",
73 "id": "crd_077f65",
74 "text": "Staging matched prod this time",
75 "votes": 0
76 }
77 ],
78 "id": "went-well",
79 "title": "Went well"
80 },
81 {
82 "cards": [
83 {
84 "author": "Tomás",
85 "createdAt": "2026-09-17T09:00:00Z",
86 "id": "crd_107f11",
87 "text": "Staging broke for two days",
88 "votes": 2
89 },
90 {
91 "author": "Priya",
92 "createdAt": "2026-09-18T10:13:00Z",
93 "id": "crd_117f48",
94 "text": "Too many tickets carried over",
95 "votes": 5
96 },
97 {
98 "author": "Jonas",
99 "createdAt": "2026-09-19T11:26:00Z",
100 "id": "crd_127f85",
101 "text": "Scope changed mid-sprint",
102 "votes": 1
103 },
104 {
105 "author": "Mei",
106 "createdAt": "2026-09-20T12:39:00Z",
107 "id": "crd_137f25",
108 "text": "PRs waited a day for review",
109 "votes": 4
110 },
111 {
112 "author": "Kwame",
113 "createdAt": "2026-09-21T13:52:00Z",
114 "id": "crd_147f62",
115 "text": "Alerts paged the wrong rotation",
116 "votes": 0
117 },
118 {
119 "author": null,
120 "createdAt": "2026-09-22T14:05:00Z",
121 "id": "crd_157f2",
122 "text": "Release notes were written last minute",
123 "votes": 3
124 },
125 {
126 "author": null,
127 "createdAt": "2026-09-23T15:18:00Z",
128 "id": "crd_167f39",
129 "text": "No time for the migration spike",
130 "votes": 6
131 },
132 {
133 "author": "Ana",
134 "createdAt": "2026-09-24T16:31:00Z",
135 "id": "crd_177f76",
136 "text": "Demo environment was down",
137 "votes": 2
138 }
139 ],
140 "id": "didnt-go-well",
141 "title": "Didn't go well"
142 },
143 {
144 "cards": [
145 {
146 "author": "Priya",
147 "createdAt": "2026-09-17T09:00:00Z",
148 "id": "crd_207f22",
149 "text": "Rotate the release captain",
150 "votes": 4
151 },
152 {
153 "author": "Jonas",
154 "createdAt": "2026-09-18T10:13:00Z",
155 "id": "crd_217f59",
156 "text": "Cap WIP at three per person",
157 "votes": 0
158 },
159 {
160 "author": "Mei",
161 "createdAt": "2026-09-19T11:26:00Z",
162 "id": "crd_227f96",
163 "text": "Add a smoke test for payments",
164 "votes": 3
165 },
166 {
167 "author": "Kwame",
168 "createdAt": "2026-09-20T12:39:00Z",
169 "id": "crd_237f36",
170 "text": "Async standup on Fridays",
171 "votes": 6
172 },
173 {
174 "author": null,
175 "createdAt": "2026-09-21T13:52:00Z",
176 "id": "crd_247f73",
177 "text": "Timebox spikes to one day",
178 "votes": 2
179 },
180 {
181 "author": null,
182 "createdAt": "2026-09-22T14:05:00Z",
183 "id": "crd_257f13",
184 "text": "Write the runbook during the incident",
185 "votes": 5
186 },
187 {
188 "author": "Ana",
189 "createdAt": "2026-09-23T15:18:00Z",
190 "id": "crd_267f50",
191 "text": "Share the retro actions in Slack",
192 "votes": 1
193 },
194 {
195 "author": "Tomás",
196 "createdAt": "2026-09-24T16:31:00Z",
197 "id": "crd_277f87",
198 "text": "Pair on the flaky tests",
199 "votes": 4
200 }
201 ],
202 "id": "ideas",
203 "title": "Ideas"
204 }
205 ],
206 "createdAt": "2026-09-17T09:00:00Z",
207 "id": "brd_01J9ZQ4M7K",
208 "phase": "revealed",
209 "settings": {
210 "hideUntilReveal": true,
211 "showNames": "optional",
212 "votesPerPerson": 5
213 },
214 "team": "Payments",
215 "title": "Sprint 42 retro"
216 }
217}
217 lines · 5.9 KB · keys sortedScrolls independently

JSON, YAML and TOML: what converts cleanly

JSON is a strict data format: double-quoted keys and strings, no comments, no trailing commas. YAML is a superset of JSON that uses indentation instead of braces and allows comments. TOML is built for config files: sections in [brackets], key = value pairs, and native dates.

Most data moves between the three without loss. The exceptions are worth knowing. TOML has no null, so null values must be dropped or replaced. YAML anchors and comments have no JSON equivalent and are lost on conversion. TOML requires every array to hold one type in older parsers, and the top level must be a table, not an array.

The diff compares structure, not text. With “Ignore key order” on, {"a":1,"b":2} and {"b":2,"a":1} are equal, which is how every JSON parser treats them. Array order always counts.

Common mistakes

  1. 01Trailing commasAllowed in JavaScript and JSON5, not in JSON. The error points at the } or ] after the comma.
  2. 02Single quotesJSON strings and keys need double quotes. {'a': 1} fails at line 1, column 2.
  3. 03Large numbers losing precisionJSON.parse turns 9007199254740993 into 9007199254740992. IDs above 2^53 should be strings.
  4. 04Tabs in YAML indentationYAML forbids tabs for indentation. Use spaces, and keep the same width at every level.

Examples

{"retry":3,"tags":["api","eu"]}
→retry: 3 tags: - api - eu
JSON to YAML.
{"server":{"port":8080}}
→[server] port = 8080
JSON to TOML. Nested objects become tables.
{"enabled": yes}
→Unexpected token y at line 1, column 13
yes is a boolean in YAML 1.1 but not valid JSON.
country: NO
→{"country": false}
The Norway problem: YAML 1.1 parsers read NO as false. Quote it, or use a YAML 1.2 parser.

Related tools