Developer Guides

How to Fix Common JSON Syntax Errors: RFC 8259 Compliance, Trailing Commas & JSONPath Debugging

Try & Tool Engineering Team• Published: 2026-10-14• 11 min read
Struggling with 'Unexpected token in JSON at position 0'? Master RFC 8259 JSON syntax rules, debug trailing commas and unquoted keys, and learn how to extract complex nested data using JSONPath.

The Frustration of Invalid JSON in Production

Every software engineer, API architect, and DevOps professional has encountered the infamous runtime exception:

SyntaxError: Unexpected token < in JSON at position 0
    at JSON.parse (<anonymous>)

In modern distributed microservices, JSON (JavaScript Object Notation, formalized by RFC 8259) is the universal data interchange format for REST APIs, GraphQL payloads, AWS Lambda events, and configuration files. Yet despite its apparent simplicity, JSON's strict grammar rules frequently cause painful parsing failures when moving data between backend languages (Python, Go, Java, PHP) and frontend browsers.

In this guide, we break down the most common JSON syntax pitfalls, examine the mathematical grammar enforced by RFC 8259, and demonstrate how to validate, repair, and query complex JSON structures using JSONPath.

You can instantly validate, repair, or inspect nested payloads with our free, 100% private JSON Formatter & Validator.


The Top 5 Most Common JSON Syntax Errors

1. "Unexpected token < in JSON at position 0"

This error almost always occurs when your API client (like fetch or axios) expects a JSON payload from a server, but receives an HTML error page instead (such as a 404 Not Found, 502 Bad Gateway, or 500 Internal Server Error page starting with <!DOCTYPE html>).

Diagnosis: Inspect your HTTP response status code before attempting to parse the body:

const response = await fetch('/api/user');
if (!response.ok) {
  const errorText = await response.text();
  throw new Error(`HTTP ${response.status}: ${errorText.slice(0, 100)}`);
}
const data = await response.json();

2. Trailing Commas in Objects and Arrays

Unlike JavaScript, Python dictionaries, or modern TypeScript, RFC 8259 JSON strictly forbids trailing commas:

// ❌ INVALID JSON (Causes SyntaxError)
{
  "service": "authentication",
  "port": 8080,
  "enabled": true,
}

// ✅ VALID RFC 8259 JSON
{
  "service": "authentication",
  "port": 8080,
  "enabled": true
}

3. Single Quotes Instead of Double Quotes

Standard JSON requires double quotes (") for both keys and string values. Single quotes (') or backticks (```) are completely invalid in standard JSON:

// ❌ INVALID JSON
{
  'userId': 'usr_94829',
  'role': 'admin'
}

// ✅ VALID RFC 8259 JSON
{
  "userId": "usr_94829",
  "role": "admin"
}

4. Unquoted Object Keys

In JavaScript object literals, quotes around property names are optional. In standard JSON, every object key MUST be wrapped in double quotes:

// ❌ INVALID JSON
{
  name: "Server-US-East",
  datacenter: "us-east-1"
}

// ✅ VALID RFC 8259 JSON
{
  "name": "Server-US-East",
  "datacenter": "us-east-1"
}

5. Python / Language-Specific Primitives (True, False, None)

When dumping data directly from Python without json.dumps(), developers often paste strings containing capitalized booleans:

Python LiteralInvalid in JSONValid RFC 8259 Equivalent
TrueTruetrue (lowercase)
FalseFalsefalse (lowercase)
NoneNonenull (lowercase)

Our Online JSON Formatter features an intelligent Auto-Repair Engine that automatically fixes single quotes, trailing commas, unquoted keys, and Python literals with a single click.


RFC 8259 Standard vs. JSON5 vs. JSONC

Understanding the differences between standard JSON and its variants helps prevent API integration bugs:

FeatureStandard JSON (RFC 8259)JSONC (VS Code Config)JSON5 (Modern Extension)
Object KeysDouble quotes strictly requiredDouble quotes strictly requiredUnquoted ECMAScript identifiers allowed
String QuotesDouble quotes (") onlyDouble quotes (") onlySingle quotes (') and double quotes (")
Trailing Commas❌ Strictly forbidden✅ Allowed✅ Allowed in objects & arrays
Comments❌ Forbidden✅ // and /* */ allowed✅ // and /* */ allowed
NumbersStandard decimalStandard decimalHex (0x12), leading decimal (.5), Infinity, NaN
Multiline Strings❌ Requires
❌ Requires
✅ Escaped newlines allowed

Extracting Nested Data with JSONPath Expressions

When dealing with massive API payloads (such as AWS CloudTrail logs, Kubernetes resource manifests, or Stripe event webhooks), traversing multi-level structures manually is inefficient. JSONPath provides an XPath-like syntax for querying JSON documents:

{
  "store": {
    "books": [
      { "category": "fiction", "title": "Dune", "price": 18.99 },
      { "category": "non-fiction", "title": "Sapiens", "price": 14.50 },
      { "category": "fiction", "title": "Neuromancer", "price": 12.00 }
    ],
    "location": "San Francisco"
  }
}

Essential JSONPath Cheat Sheet:

JSONPath SyntaxQuery DescriptionResult in Sample Payload
$.store.locationAccess direct property"San Francisco"
$.store.books[*].titleExtract all book titles["Dune", "Sapiens", "Neuromancer"]
$..priceRecursive descent: find all prices[18.99, 14.50, 12.00]
$.store.books[0, 2]Multiple array indicesFirst and third book objects
$.store.books[?(@.price < 15)]Filter expression (price < 15)["Sapiens", "Neuromancer"]
$.store.books[?(@.category == 'fiction')]Filter by category["Dune", "Neuromancer"]

Payload Optimization: Minification vs. Gzip Compression

Should you minify JSON before sending it over the network? Let us examine the telemetry metrics:

Sample Production API Response: 10,000 Records
├── Pretty-Printed (2 spaces): 1,480 KB (100% baseline)
├── Minified (Stripped whitespace): 940 KB (36.5% bandwidth reduction)
└── Gzipped Minified: 184 KB (87.6% total wire reduction)

Minifying your JSON before transmission reduces serialization overhead and network latency. Format, validate, and minify your payloads in real time with our client-side JSON Formatter & Validator.