JSON Data Generator
Generate fake JSON from a small template of Faker tokens and repeat() — seeded, reproducible, entirely on this device.
Same template + seed = identical JSON.
Repeat a shape: make {{repeat(n)}} the first element of a two-item array, like ["{{repeat(5)}}", <shape>]. Use {{index}} for the 0-based position.
Your generated JSON appears here. Write a template, then Generate.
Press ? for shortcuts
Do it offline:$ node -p "JSON.stringify(Array.from({length:3},()=>({name:require('@faker-js/faker').faker.person.fullName()})),null,2)"
How to use it
- Write the JSON you want — objects, arrays, and plain values — as strict, double-quoted JSON. Wherever a value should be fake, type a token like {{fullName}}, {{email}}, or {{uuid}}.
- Reach for the palette instead of typing: it groups all 31 tokens. The numeric ones take a range — {{integer(1,100)}}, {{amount(5,500)}} — and {{words(4)}} sets a length.
- For a list, shape the array as ["{{repeat(3)}}", <item>]: the first slot is the count, the second is the template to repeat. Nest a repeat inside an item for child arrays, and use {{index}} for the row number.
- Leave the seed blank for a fresh random batch — the seed used shows in a chip — or pin a number so the output never changes.
- Press Generate, or ⌘/Ctrl + Enter, then toggle pretty or compact and copy or download the .json. Share folds template and seed into one link.
Paste a JSON shape, drop a few double-brace tokens into it, and this tool fills them with fake data — names, emails, UUIDs, numbers, dates, and more. Wrap any item in a repeat() and you get an array of that shape. Every run is seeded, so the same template and seed rebuild byte-for-byte identical JSON, and the whole thing runs here in your browser.
Examples
["{{repeat(3)}}",{"id":"{{uuid}}","name":"{{fullName}}"}][
{
"id": "5fb9220d-9b0f-4d32-a248-6492457c3890",
"name": "Tracey Schowalter-Haag"
},
{
"id": "a7170e4a-4882-4fcf-8e9e-130564d5482c",
"name": "Clotilde Schultz"
},
{
"id": "bc151d95-145b-4ae7-81bc-8c786010a58e",
"name": "Danika Greenfelder"
}
]The array head ["{{repeat(3)}}", …] stamps out three copies of the object after it. Each row draws its own id and name, so seed 42 always returns these three people.
{"n":"{{integer(1,10)}}","b":"{{boolean}}","lat":"{{latitude}}","amt":"{{amount(5,100)}}","label":"user-{{integer(1,9)}}"}{
"n": 7,
"b": true,
"lat": -49.1668,
"amt": 57.38,
"label": "user-7"
}A string that is exactly one token keeps that token's native type — n arrives as a number, b as a real boolean, lat as a float. Surround a token with text, as in user-{{integer(1,9)}}, and the field becomes a string.
["{{repeat(2)}}",{"team":"{{company}}","members":["{{repeat(2)}}",{"name":"{{firstName}}","idx":"{{index}}"}]}][
{
"team": "Bartell, Gulgowski and Adams-Russel",
"members": [
{
"name": "Jeremy",
"idx": 0
},
{
"name": "Wendell",
"idx": 1
}
]
},
{
"team": "Effertz LLC",
"members": [
{
"name": "Reilly",
"idx": 0
},
{
"name": "Astrid",
"idx": 1
}
]
}
]Repeats nest: two teams, each with two members, for six rows in all. Inside the inner repeat, {{index}} numbers the members from zero, while {{company}} and {{firstName}} keep drawing independently.
{"score":"{{integer(5,1)}}"}Token "integer" range is inverted: the first number must be less than or equal to the second.The two bounds are backwards, so the template is refused before anything is drawn — swap them to {{integer(1,5)}}. The check runs on restored links too, since a shared template is untrusted input.
Every example on this page is executed against the same engine that powers the tool, on every build.
Gotchas worth knowing
Strict JSON, on purpose
The template must be valid double-quoted JSON — no single quotes, trailing commas, or comments. That strictness lets the tool flag the exact character that is off, instead of guessing at a loose JavaScript object.
One token keeps its type
A field whose entire value is a single token inherits that token's type: {{integer(1,10)}} lands as a JSON number and {{boolean}} as true or false. Join anything around a token and the field becomes a string.
Dates are frozen, not live
{{date}} and {{datetime}} draw from a fixed span between 2020 and 2030, never the wall clock, so a shared link reproduces the same instants tomorrow. Your permalink stays a stable fixture instead of drifting a day at a time.
Where the caps sit
One repeat() tops out at 1,000 copies and a whole template at 50,000 resolved items; past either bound the run is refused with the number named. The estimate is read from the repeat counts alone, before any value is generated.
These values are fake
Values are randomly generated by Faker for testing — realistic in shape, identifying no one; generated emails can hit real domains, so never send to them. Treat every field as filler for demos and fixtures, never as a real identity or a working address.
Common errors
Expected double-quoted property name in JSON at position 7 (line 1 column 8)- The template is parsed as strict JSON, so a trailing comma, a single quote, or an unquoted key stops it — and the message names the exact position, which the editor can jump to.
Unknown token "fullname". Tokens are case-sensitive — check spelling and see the token palette.- Tokens are spelled exactly as the palette lists them, and case matters: {{fullname}} is unknown where {{fullName}} is not. The message echoes back the id it could not place.
Token "integer" expects 2 argument(s) but got 0.- Ranged tokens need their numbers: {{integer}} and {{integer(1)}} are refused where {{integer(1,100)}} works. The same rule governs {{float}} and {{amount}}.
{{repeat(n)}} must be the first element of a two-item array, like ["{{repeat(3)}}", <template>].- repeat() is structural, not a value — it only works as the first of exactly two array elements. A repeat token anywhere else, or in an array of three, is refused.
This template would generate too many items — a single repeat() is capped at 1,000 and the whole template at 50,000. Lower a repeat() count or split the template.- The total is estimated from the repeat counts before any data is drawn, so an oversized request fails fast. Nested repeats multiply, which is how a modest-looking template can blow past the cap.
FAQ
Is this a JSON Schema faker?
Not quite. You write the finished JSON shape and mark the fake fields with {{tokens}}, rather than describing a schema for the tool to fill in. It is a fill-in-the-blanks template, and needs no schema file.
How do I make an array of many objects?
Put the object inside a repeat array: ["{{repeat(50)}}", { … }]. The first element sets the count and the second is the shape repeated for each row. Nest another repeat inside for child lists, within the 1,000-per-repeat and 50,000-item caps.
Will the same template always produce the same JSON?
Yes, whenever you pin the seed. Leave it blank and each Generate mints a new one, shown in a chip and folded into the Share link, so a colleague rebuilds your exact output. Reproducibility holds within one Faker version.
Keyboard shortcuts
- ⌘/Ctrl + Enter
- Generate JSON from the current template (mints a seed if blank).
- ⌘/Ctrl + S
- Download the generated JSON as a .json file.
- ⌘/Ctrl + C
- Copy the output when nothing is selected and it is under 1 MB.
- ⌘/Ctrl + Shift + C
- Copy the output even while a selection exists.
- t
- Cycle the color theme.
- ? or ⌘/Ctrl + /
- Open the shortcut help dialog.
- Esc
- Close the open dialog.