How to validate json changes before and after deployment
- Step 1Capture the pre-deploy snapshot — Before deploying, capture the JSON you'll re-check after: the response from a canary endpoint, the resolved config dump, or one representative record exported as JSON. Save it somewhere you can paste from.
- Step 2Deploy, then capture the post-deploy snapshot the same way — After the release is live, capture the identical snapshot — same endpoint, same config command, same record id. Consistency between the two captures is what makes the diff trustworthy.
- Step 3Paste the pre-deploy snapshot on the left — Paste the 'before' JSON into
JSON A (base). It must be a single valid JSON value; strip any log envelope or header wrapper so only the snapshot remains. - Step 4Paste the post-deploy snapshot on the right — Paste the 'after' JSON into
JSON B (modified). Both panels are required before the tool will run. - Step 5Click Compare and validate each change — Walk the diff list. Confirm every
added/changedentry corresponds to something the release was meant to do. Anyremovedfield, or achangedentry where the type flipped, is a candidate regression. - Step 6Attach the diff to the release record — Use
Copy JSONto capture the diff and paste it into the deploy ticket or runbook as validation evidence. Anidenticalresult for an endpoint that should be unaffected is just as valuable as a clean list of intended changes.
Deployment validation verdicts by diff type
How to read each entry type when validating a release. The verdict assumes you have a list of intended changes to check against.
| Diff entry | Meaning post-deploy | Verdict if intended | Verdict if unexpected |
|---|---|---|---|
added | New field appeared after the deploy | Pass — the release added it | Investigate — an extra field you didn't ship (often a leaked debug field) |
removed | Field present before, gone after | Pass — the release deprecated it | Stop — a regression; downstream consumers will see undefined |
changed (value) | Same field, different value | Pass — expected data/config update | Investigate — drift, a side-effect, or a bad migration |
changed (type flip) | "42" → 42, true → "true" | Pass only if the release intended a type change | Stop — a near-certain breaking change for typed clients |
Snapshot sources you can diff pre/post deploy
All are pasted as JSON. Pick a snapshot that is stable across runs so only the deploy's effect shows.
| Snapshot | How to capture | Watch out for |
|---|---|---|
| API response | Call a canary endpoint before and after; copy the body | Strip volatile fields (timestamps, request ids) or they'll show as changed every time |
| Health / readiness payload | GET /health or /readyz JSON before and after | Dependency version strings will diff — that may be exactly what you want to confirm |
| Resolved config | App config-dump command before and after | Redact secrets; diff structure and non-secret values |
| Representative DB record | Export the same record id as JSON before and after a migration | updatedAt will always change — exclude it or expect one changed entry |
| Feature-flag state object | Export the flag service's state JSON before and after | Array-of-rules ordering is positional; sort if order isn't meaningful |
Cookbook
Anonymised pre/post-deploy snapshot pairs. Left is the 'before' capture, right is 'after'. Volatile fields (timestamps, ids) are trimmed so the deploy's real effect is visible.
A clean deploy: only the intended field changed
ExampleThe release bumped an API version string and added one feature flag. The diff confirms nothing else moved — exactly the evidence a runbook wants.
JSON A (pre-deploy): JSON B (post-deploy):
{ {
"apiVersion": "2.3.0", "apiVersion": "2.4.0",
"flags": { "newNav": false } "flags": { "newNav": true }
} }
Diff:
~2 changed
changed apiVersion - "2.3.0" + "2.4.0"
changed flags.newNav - false + true
→ Both changes are intended. Pass.Regression caught: a field vanished after deploy
ExampleThe release accidentally dropped pricing.currency from the response. A removed entry stops the rollout before a client crashes on the missing field.
JSON A (pre): JSON B (post):
{ {
"pricing": { "pricing": {
"amount": 1999, "amount": 1999
"currency": "USD" }
} }
}
Diff:
-1 removed
removed pricing.currency
- "USD"
→ Unintended removal. Stop and roll back.Migration check: type flip on a record field
ExampleA DB migration meant to keep quantity as a number accidentally serialized it as a string. The diff exposes the type flip as a changed entry.
JSON A (record before): JSON B (record after):
{ {
"sku": "AB-12", "sku": "AB-12",
"quantity": 10 "quantity": "10"
} }
Diff:
~1 changed
changed quantity - 10 + "10"
→ Type flipped to string. Breaking for typed consumers.Excluding the always-changing timestamp
ExampleIf you diff a record with an updatedAt, it will always change. Either accept the single expected entry or strip it from both snapshots first so the diff shows only the deploy's real effect.
Strip updatedAt from both with the null/key tools first, then:
JSON A: JSON B:
{ "status": "active" } { "status": "active" }
Diff:
No differences
→ The two JSON values are identical. (updatedAt excluded.)Confirming an unaffected endpoint stayed identical
ExamplePart of validation is proving the deploy did NOT touch endpoints it shouldn't. An identical result is positive evidence.
JSON A (pre, /v1/regions): JSON B (post, /v1/regions):
{ "regions": ["us","eu"] } { "regions": ["us","eu"] }
Diff:
No differences
→ The two JSON values are identical.
→ Attach to ticket: /v1/regions unaffected by release.Errors and edge cases
Real errors and silent failures sourced from each platform's own documentation. Match the wording to the row, fix what the row says to fix.
Volatile fields (timestamps, request ids) always diff
ExpectedAn updatedAt, generatedAt, or requestId differs on every capture and shows as a changed entry that has nothing to do with your release. Either strip those fields from both snapshots before pasting (use /tool/json-key-filter or /tool/json-null-stripper as appropriate) or mentally exclude them when reading the diff.
Type flip reads as `changed`, not a typed error
By designA migration that turns 10 into "10" is caught — as a changed entry whose from/to reveal a number became a string. There is no special type-mismatch badge; the value pair is the evidence, and for deployment validation a type flip is almost always a stop-the-rollout finding.
Reordered array after deploy shows many changes
Positional by designArrays compare by index, so a post-deploy response that returns the same items in a different order produces changed [0], changed [1], and so on. If ordering isn't part of the contract, sort both snapshots' arrays before pasting so true item changes aren't buried.
Snapshot wrapped in a log envelope won't parse
Parse errorBoth inputs go through strict JSON.parse. A capture that includes log prefixes, headers, or a data: wrapper throws a parser error. Paste only the JSON body; if your capture is near-JSON (trailing commas, comments), repair it first with /tool/json-format-fixer.
Only one snapshot pasted
InvalidBoth JSON A and JSON B are required; an empty or whitespace-only side returns Please provide both JSON A and JSON B. Capture both the pre- and post-deploy snapshots before running the comparison.
Snapshot over 2 MB on the free plan
Upgrade requiredEach pasted snapshot is capped at 2 MB on free; over that returns Free plan supports JSON inputs up to 2 MB. Upgrade to Pro for unlimited input size. Snapshot one representative item or extract the relevant sub-tree with /tool/json-path-extractor to stay under the cap, or upgrade to Pro.
`1` vs `1.0` shows no difference
ExpectedJSON.parse reads 1 and 1.0 as the same number, so a numeric-formatting change between captures is invisible here. If a serializer-precision change is what you're validating, this tool can't detect it — the distinction is lost at parse time.
Identical pre/post snapshot
SupportedWhen the before and after match (after key-order normalisation), the panel shows The two JSON values are identical. For an endpoint or record that the release should not have touched, that is exactly the green light you want to record.
Frequently asked questions
How do I diff database schema changes using JSON?
Export the schema as JSON via your introspection tool (Prisma's JSON output, a converted pg_dump --schema-only, or Drizzle's introspection), then paste the before-migration and after-migration schema JSON. The diff shows exactly which tables and columns were added, removed, or changed — letting you confirm the migration matched the intended DDL and nothing else moved.
What should I do if the diff shows unexpected changes?
Triage by entry type. A removed field or a changed entry where the type flipped is breaking — if the rollout is still in progress, halt it; if complete, evaluate a rollback. Non-breaking surprises (an extra additive field, an expected value update) get documented and investigated before the next release. The copied diff is your audit trail.
How do I stop timestamps from polluting the validation diff?
Volatile fields like updatedAt change on every capture. Strip them from both snapshots before pasting — remove the keys with /tool/json-key-filter, or null them out and use /tool/json-null-stripper. Then the diff reflects only the deploy's real effect.
Why does a reordered list count as changes?
Arrays are compared by index, so the same items in a new order read as a sequence of changed entries. For collections where order isn't part of the contract, sort both snapshots' arrays the same way before pasting so only genuine item differences remain.
Can I automate this in CI?
This is a browser paste tool, not a CLI, so it's for human validation in the runbook rather than an automated gate. For CI, the underlying logic is the same idea: diff two JSON snapshots and fail if removed or type-changed entries appear. Use this tool to author and eyeball the comparison, then script the equivalent check in your pipeline.
Does object key order between captures matter?
No. Objects are compared by key, so if a framework upgrade in the deploy reordered response keys, the diff stays clean. Only genuine added/removed keys and value changes show — which is precisely what you want when a deploy bundles a serializer change.
How big a snapshot can I diff for free?
Up to 2 MB per side on the free plan. Production responses can exceed that, so snapshot one representative item or extract the relevant sub-tree first with /tool/json-path-extractor. Pro removes the size cap entirely.
Can I upload the snapshot files?
No — the tool is paste-only, with a base panel and a modified panel. Copy each captured snapshot and paste it. There is no file picker, and because everything runs locally, your production snapshots never leave the browser.
What's a good 'unaffected endpoint' check?
Pick an endpoint the release was not supposed to touch, snapshot it pre and post, and confirm The two JSON values are identical. Recording an identical result is as much a part of release validation as confirming the intended changes — it proves the blast radius was contained.
Is the deployment state data transmitted to JAD Apps?
No. Both snapshots are parsed and diffed in your browser. Pre- and post-deploy captures — including production response bodies and internal state — are never sent to a server. Clicking Compare triggers no network request.
Should pure-additive changes block a release?
Usually not — added fields are safe for tolerant consumers that ignore unknown keys, though they can break strict-schema validators. The dangerous entries are removed fields and type-changed values. Gate your go/no-go on those, and treat additions as a heads-up to update downstream schemas.
Privacy first
Conversion runs locally in your browser. No file is uploaded — only metadata counters are saved for signed-in dashboard stats.