JSON Parse Error: Causes, Solutions, and Prevention
JSON parse errors are among the most common runtime exceptions in web development. Whether you are using JSON.parse() in JavaScript, json.loads() in Python, ObjectMapper in Java, or json.Unmarshal() in Go, malformed JSON will throw an exception. This comprehensive guide covers every type of parse error, how to read error messages, and how to prevent them.
What Is a JSON Parse Error?
A JSON parse error occurs when the parser encounters input that does not conform to valid JSON syntax. The parser throws an exception indicating what went wrong and at what position. Our JSON Validator provides the same level of detail as native parsers, with a user-friendly interface.
Complete Taxonomy of JSON Parse Errors
JavaScript (JSON.parse())
| Error Message | Meaning |
|---|---|
Unexpected token ' in JSON at position 5 | Single quote used instead of double quote at position 5 |
Unexpected token , in JSON at position 10 | Trailing or extra comma at position 10 |
Unexpected token } in JSON at position 3 | Extra closing brace with no matching opening |
Unexpected token < in JSON at position 0 | HTML/XML returned instead of JSON (often a 404 page) |
Unexpected end of JSON input | JSON string is truncated or empty |
Expected ',' or '}' after property value | Missing comma between properties |
Expected ',' or ']' after array element | Missing comma between array elements |
Bad escape character in string | Invalid escape sequence like \x or \z |
Invalid or unexpected token | General syntax error, often garbage characters |
Python (json.loads())
| Error Message | Meaning |
|---|---|
json.JSONDecodeError: Expecting value: line 1 column 1 (char 0) | Empty string or non-JSON input |
json.JSONDecodeError: Expecting property name enclosed in double quotes | Unquoted key or single-quoted key |
json.JSONDecodeError: Expecting ',' delimiter | Missing comma between items |
json.JSONDecodeError: Expecting ':' delimiter | Missing colon between key and value |
json.JSONDecodeError: Extra data | Multiple JSON documents in one string (use NDJSON instead) |
Detailed Solutions for Common Parse Errors
Error: "Unexpected token ' in JSON at position X"
Cause: Single quote used instead of double quote.
// Problem
{'name': 'Alice'} // SyntaxError: Unexpected token '
// Solutions
{"name": "Alice"} // Correct JSON
// Use JSON Fixer: /json-fixer
Error: "Unexpected token < in JSON at position 0"
Cause: Server returned HTML (404 page, error page) instead of JSON.
// Problem
fetch('/api/users/999').then(r => r.json()) // 404 HTML page
// Solution
const response = await fetch(url);
if (!response.ok) {
throw new Error(`HTTP ${response.status}: ${response.statusText}`);
}
const text = await response.text();
try {
const data = JSON.parse(text);
} catch {
console.error("Expected JSON, got:", text.substring(0, 200));
}
Error: "Expected ',' or '}' after property value"
Cause: Missing comma between object properties.
// Problem
{"name": "Alice" "age": 30}
// Solution
{"name": "Alice", "age": 30}
Language-Specific Parse Error Handling
JavaScript
function safeJSONParse(str) {
try {
return { data: JSON.parse(str), error: null };
} catch (error) {
if (error instanceof SyntaxError) {
return {
data: null,
error: {
message: error.message,
position: error.message.match(/position (\d+)/)?.[1],
// Use JSON Validator for detailed analysis
}
};
}
throw error;
}
}
Python
import json
from json import JSONDecodeError
def safe_parse(json_string):
try:
return json.loads(json_string)
except JSONDecodeError as e:
print(f"Parse error at line {e.lineno}, col {e.colno}: {e.msg}")
print(f"Position {e.pos}: ...{json_string[max(0,e.pos-20):e.pos+20]}...")
raise
Java (Jackson)
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
public <T> T safeParse(String json, Class<T> clazz) {
try {
return new ObjectMapper().readValue(json, clazz);
} catch (JsonProcessingException e) {
// Get exact location
JsonLocation loc = e.getLocation();
System.err.printf("Error at line %d, col %d: %s%n",
loc.getLineNr(), loc.getColumnNr(), e.getMessage());
return null;
}
}
Go
import "encoding/json"
func safeUnmarshal(data []byte, v interface{}) error {
err := json.Unmarshal(data, v)
if err != nil {
if syntaxErr, ok := err.(*json.SyntaxError); ok {
// Get context around the error
start := int(syntaxErr.Offset) - 30
if start < 0 { start = 0 }
end := int(syntaxErr.Offset) + 30
if end > len(data) { end = len(data) }
log.Printf("JSON syntax error at offset %d: %s",
syntaxErr.Offset, string(data[start:end]))
}
return err
}
return nil
}
Building a Parse-Error-Proof Application
Follow these layers of protection:
- Input validation â Use our JSON Validator to check syntax before parsing
- Schema validation â Use our JSON Schema Validator to check structure
- Try/catch blocks â Always wrap parsing in error handling
- Graceful degradation â Provide fallback values or cached data
- Monitoring â Track parse error rates in production
- Logging â Log raw input (truncated for security) when errors occur
Preventing Parse Errors in Production
- Validate JSON before storing with our online validator
- Use JSON Schema for API contracts
- Implement health checks for JSON endpoints
- Use our JSON Linter in CI/CD pipelines
- Monitor with structured logging