Quick Answer
JSON string has invalid syntax. Check for proper quotes, no trailing commas, escaped characters, and valid JSON format. Use JSON.parse() with try-catch.
Understanding the Issue
JSON parsing errors occur when the string being parsed does not conform to valid JSON syntax. Common issues include single quotes instead of double quotes, trailing commas, unescaped characters, undefined values, functions, or comments. JSON is stricter than JavaScript object literals. Proper error handling and JSON validation are essential for robust applications that process external data.
The Problem
This code demonstrates the issue:
Javascript
Error
// Problem 1: Invalid JSON syntax
const invalidJson1 = "{name: 'John', age: 30}"; // Single quotes, unquoted keys
const invalidJson2 = '{"name": "John", "age": 30,}'; // Trailing comma
const invalidJson3 = '{"name": "John", "comment": "He said \"Hello\""}'; // Unescaped quotes
try {
const data1 = JSON.parse(invalidJson1); // SyntaxError
} catch (error) {
console.log("Error 1:", error.message);
}
try {
const data2 = JSON.parse(invalidJson2); // SyntaxError
} catch (error) {
console.log("Error 2:", error.message);
}
The Solution
Here's the corrected code:
Javascript
Fixed
// Solution 1: Correct JSON formatting
const validJson1 = '{"name": "John", "age": 30}'; // Double quotes, no trailing comma
const validJson2 = '{"name": "John", "comment": "He said \"Hello\""}'; // Escaped quotes
const validJson3 = '{"items": [1, 2, 3], "active": true, "data": null}'; // Valid values
try {
const data1 = JSON.parse(validJson1);
const data2 = JSON.parse(validJson2);
const data3 = JSON.parse(validJson3);
console.log("Valid data 1:", data1);
console.log("Valid data 2:", data2);
console.log("Valid data 3:", data3);
} catch (error) {
console.error("Parsing error:", error.message);
}
// Solution 2: Safe JSON parsing function
function safeJsonParse(jsonString, defaultValue = null) {
try {
return JSON.parse(jsonString);
} catch (error) {
console.error("JSON parse error:", error.message);
console.error("Invalid JSON:", jsonString);
return defaultValue;
}
}
// Test with various inputs
const testCases = [
'{"valid": true}',
'{invalid: json}',
'{"trailing": "comma",}',
'{"valid": "array", "items": [1, 2, 3]}'
];
testCases.forEach((testCase, index) => {
const result = safeJsonParse(testCase, { error: true });
console.log(`Test ${index + 1}:`, result);
});
// Solution 3: JSON validation before parsing
function isValidJson(str) {
try {
JSON.parse(str);
return true;
} catch (error) {
return false;
}
}
function validateAndParse(jsonString) {
if (typeof jsonString !== 'string') {
return { success: false, error: "Input is not a string" };
}
if (!isValidJson(jsonString)) {
return { success: false, error: "Invalid JSON format" };
}
try {
const data = JSON.parse(jsonString);
return { success: true, data };
} catch (error) {
return { success: false, error: error.message };
}
}
// Test validation
const testInputs = [
'{"name": "Alice", "age": 25}',
'{name: "Bob"}',
'{"valid": true, "list": [1, 2, 3]}'
];
testInputs.forEach(input => {
const result = validateAndParse(input);
console.log("Validation result:", result);
});
Key Takeaways
Always use try-catch when parsing JSON to handle invalid format errors. JSON.parse() converts strings to JavaScript objects. Use double quotes for JSON strings and property names. Remove trailing commas.