DEV Community

AI JSONMedic
AI JSONMedic

Posted on

5 Ways ChatGPT Breaks Your JSON (And How to Fix Each One)

If you've ever asked ChatGPT to return JSON, you've probably seen this error:

SyntaxError: Unexpected token
Enter fullscreen mode Exit fullscreen mode

ChatGPT and GPT-4o are great at generating almost valid JSON — close enough for a human to read, but broken enough to crash JSON.parse(). After repairing thousands of broken JSON documents, here are the 5 most common ways ChatGPT breaks your JSON, with fixes for each.


1. Markdown Code Fence Wrapping

The problem: You ask for JSON. ChatGPT wraps it in markdown:

Here is the JSON you requested:

\`\`\`json
{"name": "Alice", "role": "engineer"}
\`\`\`
Enter fullscreen mode Exit fullscreen mode

The fix: Strip everything before the first { and after the last }:

const raw = chatgptResponse;
const start = raw.indexOf('{');
const end = raw.lastIndexOf('}');
const clean = raw.slice(start, end + 1);
JSON.parse(clean);
Enter fullscreen mode Exit fullscreen mode

2. Trailing Commas

The problem: ChatGPT adds trailing commas after the last array/object item:

{"items": ["apple", "banana", "cherry",]}
Enter fullscreen mode Exit fullscreen mode

This is valid JavaScript but illegal in strict JSON.

The fix:

cleaned = json.replace(/,(\s*[}\]])/g, '$1');
Enter fullscreen mode Exit fullscreen mode

3. Python Booleans

The problem: ChatGPT sometimes outputs Python-style booleans:

{"active": True, "deleted": False, "metadata": None}
Enter fullscreen mode Exit fullscreen mode

The fix:

cleaned = cleaned
  .replace(/\bTrue\b/g, 'true')
  .replace(/\bFalse\b/g, 'false')
  .replace(/\bNone\b/g, 'null');
Enter fullscreen mode Exit fullscreen mode

4. JavaScript Comments

The problem: ChatGPT adds helpful comments that break JSON:

{
  // User profile
  "id": 42,
  "name": "Alice" /* primary user */
}
Enter fullscreen mode Exit fullscreen mode

The fix: Strip both line and block comments (careful not to touch strings):

// Simple version (doesn't handle comments inside strings)
cleaned = cleaned
  .replace(/\/\/.*$/gm, '')
  .replace(/\/\*[\s\S]*?\*\//g, '');
Enter fullscreen mode Exit fullscreen mode

5. Truncated Responses

The problem: When ChatGPT hits its token limit, JSON gets cut off mid-stream:

{"users": [{"id": 1, "name": "Alice"}, {"id": 2, "na
Enter fullscreen mode Exit fullscreen mode

The fix: This one is hard to fix with regex. You need to close unclosed strings, arrays, and objects. A robust approach:

// Close unclosed structures
let depth = { brace: 0, bracket: 0, inString: false };
// ... (requires a state machine parser)
Enter fullscreen mode Exit fullscreen mode

The Easy Way: Use a JSON Fixer

Writing all these cleanup rules yourself is tedious and error-prone. I built AI JSONMedic — a free online tool that handles all 5 of these cases (and more) in one click.

Just paste the raw ChatGPT output — markdown wrappers, Python booleans, comments, and all — and get clean, valid JSON back instantly. It runs entirely in your browser, so your data never leaves your device.

Try it free: aijsonmedic.com


TL;DR

Error Cause Quick Fix
Markdown wrapping ChatGPT adds code fences Strip before first {
Trailing commas JS habit, illegal in JSON Regex remove
Python booleans True/False/None Replace with true/false/null
Comments Helpful but illegal Strip // and /* */
Truncation Token limit hit Close unclosed structures

Have you run into other ChatGPT JSON bugs? Drop them in the comments!

Top comments (1)

Collapse
 
harjjotsinghh profile image
Harjot Singh

Every one of these is painfully familiar - the markdown fences around the JSON, the trailing comma, the "Sure! Here's your JSON:" preamble, the hallucinated extra field, the truncation mid-object. The root cause is that a text model emits text, and JSON is a happy accident of that text being well-formed. Treating "the model returned valid JSON" as guaranteed is the bug; it's a probability, not a promise.

The durable fix beyond per-symptom patches: constrain + validate + retry. Use structured-output/tool-calling modes where the API enforces the schema (eliminates most of these by construction), then validate against a schema on your side and auto-retry on failure rather than trusting the first response. Parse-don't-pray. That validate-and-gate discipline is core to how Moonshift (a multi-agent pipeline that ships a prompt to a deployed SaaS) does inter-agent handoffs - every structured output is schema-checked at the boundary, so a malformed response gets caught and retried, not silently passed downstream. Genuinely useful, practical list. Are you leaning on the provider's structured-output mode, or doing your own parse-and-repair? The native schema-enforcement modes have made a lot of these failure modes mostly disappear for me.