Expecting ',' delimiter

The parser finished one value and found the next one starting straight away, with no comma between them. Here is the trap. You get this same message when a comma is genuinely missing and when a string ended earlier than you meant it to. The second case is far more common, so check your quotes first.

How the message appears

CPython's json module reports line, column and character offset. Treat the position as an upper bound. An unterminated string moves it well past the real mistake.

  • json.decoder.JSONDecodeError: Expecting ',' delimiter: line 2 column 22 (char 23)
  • json.decoder.JSONDecodeError: Expecting ':' delimiter: line 1 column 10 (char 9)

The fix

Escape every double quote that belongs inside a string as \", and add any comma that really is missing. If the reported column points at text that looks perfectly fine, read backwards from there for a quote that closed a string too early.

Fails to parse
{
  "quote": "she said "hi" to me",
  "id": 2
}
Parses
{
  "quote": "she said \"hi\" to me",
  "id": 2
}

The example travels in the URL fragment, which browsers never send to a server.

What causes it

An unescaped double quote inside a string

Check this one first. "she said "hi" to me" is not one string with quotes inside it. It is the string "she said ", then the bare word hi, then more text. The parser sees two values in a row, reports a missing comma, and points at innocent-looking text several characters past the real mistake.

A genuinely missing comma

Two keys or two array items with nothing between them. Usually a hand edit, or a merge that dropped a line.

A colon typed as a comma

This gives you the sibling message Expecting ':' delimiter instead. Python read a key, and what came after it was not a colon.

Worth knowing

  • Never build JSON by dropping text into a template with an f-string or %. The first value that contains a quote, an apostrophe-heavy sentence or a Windows path gives you this error. json.dumps escapes properly, and it is not slower in any way you will notice.
  • The sibling message Expecting ':' delimiter has the same shape. Something turned up where the parser knew one specific character had to go.

Written by Vishnu Shankar.

Your JSON and text are processed entirely in your browser and are never sent anywhere. To understand how the site is used we record each page view (the page, the referrer and an approximate location from your IP address) and keep it for 90 days. Nothing is stored on your device unless you choose it. Accept to also store a device identifier here and record your browser and device characteristics, which is what lets a return visit be told from a new one. Decline and nothing is sent at all. We respect Do Not Track. See our privacy policy.