Zerowidth CleanerAll measured guides

CLAUDE WATERMARK REMOVER · PRACTICAL TEST

Why does JSON still fail after the hidden character is removed?

Our cleaner turns [1, plus U+200B plus ] into [1,], which still throws SyntaxError in JSON.parse. A trailing comma is a grammar problem. Fix it with a deliberate structural edit and validate the complete JSON again.

Tested October 20, 2026 · v24.19.0 · 4 measured runs

Open the Claude text cleaner · Full measured data

Code-point comparison for Marked array with comma

Measured inputs and outputs

These are locally constructed test strings, not evidence that Claude inserts these characters. We executed the saved homepage script snapshot with a minimal DOM harness and compared exact strings. The invisible-checkbox state and dash mode appear in each row. The observations below test this page's specific question. Destination observations run independently on the exact input and cleaned strings in the recorded Node runtime. We make no detector-score or statistical-watermark removal claim.

Before and after observations; full code points and strings are in the JSON download.
Fixture and modeInput string and code pointsOutput and cleaner statusObserved before / after
Marked array with comma
direct string / keep / invisible true
"[1,​]"
U+005B U+0031 U+002C U+200B U+005D
"[1,]"
Removed 1 invisible character
{"accepted":false,"errorName":"SyntaxError"}
{"accepted":false,"errorName":"SyntaxError"}
Array trailing comma
direct string / keep / invisible true
"[1,]"
U+005B U+0031 U+002C U+005D
"[1,]"
No selected invisible characters found
{"accepted":false,"errorName":"SyntaxError"}
{"accepted":false,"errorName":"SyntaxError"}
Object trailing comma
direct string / keep / invisible true
"{\"a\":1,}"
U+007B U+0022 U+0061 U+0022 U+003A U+0031 U+002C U+007D
"{\"a\":1,}"
No selected invisible characters found
{"accepted":false,"errorName":"SyntaxError"}
{"accepted":false,"errorName":"SyntaxError"}
Valid array
direct string / keep / invisible true
"[1]"
U+005B U+0031 U+005D
"[1]"
No selected invisible characters found
{"accepted":true,"value":[1]}
{"accepted":true,"value":[1]}

One successful deletion leaves a second defect

The marked array contains one selected invisible character after its comma. The cleaner removes it exactly as recorded, leaving the visible string [1,]. JSON.parse rejects both versions with SyntaxError. The cleaner status and the parser outcome therefore describe different stages: the selected character was removed, but the resulting source still violates the destination grammar. This row is a useful diagnostic for a workflow that reports clean and then encounters another import error. It establishes neither a failed deletion nor a promise that removing the character should have repaired all remaining syntax.

Array and object controls isolate the grammar

The plain trailing-comma array and the object with a final comma are unchanged by cleanup and also fail. The valid [1] control succeeds before and after. Those comparisons remove the invisible character as a necessary explanation for rejection. We call JSON.parse on the entire string and record error names without presenting runtime-specific error wording as a universal diagnostic. No object literal is evaluated as JavaScript source. A trailing comma accepted in another language or configuration dialect does not establish acceptance by the strict parser measured here, even if the visible syntax looks familiar.

Make a structural correction outside the cleaner

For a real document, retain the original and locate the actual syntax defect with the intended parser or editor. Correct the unwanted comma in a working copy, then validate the complete result. Do not apply a blind comma-before-bracket replacement across raw text because punctuation inside quoted strings can be meaningful content. A grammar-aware tool can distinguish those contexts. This homepage is a character transformer and offers no JSON repair policy. Our experiment runs its unchanged callback and then observes parsing; it does not secretly delete a comma to manufacture a successful import.

Keep the claimed boundary precise

Strict JSON validity still does not guarantee required properties, accepted types or application-level meaning. Those require a separate schema or consumer check. This page addresses one particular remaining grammar error, distinct from our existing controls-inside-strings and root-type guides. We do not test JSON5, a configuration editor, a network API or a database importer. The public downloads give the exact four sources and saved script needed to reproduce this limited result. Nothing here establishes the origin of the text or whether a statistical mark is present; it explains why one successful cleanup can coexist with a parser failure.

Reproduce this test

Save reproduce.cjs and tested-app.js in the same folder. Run the command below with Node.js. The harness prints its runtime, script SHA-256 and every measured row. Compare those rows with the original record. Using a newer script or runtime creates a new experiment; retain the version information with your rerun.

node reproduce.cjs

Reference and next check

RFC 8259 JSON grammar provides the relevant primary definition. The table and fixture analysis are original measurements. For broader inspection, use our Unicode inspector. Read the scope distinction before interpreting cleanup as a watermark result.