1. 使用 JSON.parse() 方法(推荐)
function isValidJSON(str) {
try {
JSON.parse(str);
return true;
} catch (e) {
return false;
}
}
// 测试用例
console.log(isValidJSON('{"name": "John", "age": 30}')); // true
console.log(isValidJSON('{"name": "John", "age": 30')); // false(缺少闭合括号)
console.log(isValidJSON('{name: "John", "age": 30}')); // false(键未加引号)2. 更详细的校验函数
function validateJSON(str) {
try {
const result = JSON.parse(str);
return {
isValid: true,
data: result,
error: null
};
} catch (error) {
return {
isValid: false,
data: null,
error: error.message
};
}
}
// 使用示例
const test1 = validateJSON('{"name": "John", "age": 30}');
console.log(test1);
// { isValid: true, data: {name: "John", age: 30}, error: null }
const test2 = validateJSON('{"name": "John", age: 30}');
console.log(test2);
// { isValid: false, data: null, error: "Unexpected token a in JSON at position 16" }3. 使用正则表达式进行基础格式检查
function isJSONFormat(str) {
// 基础的正则检查,不能完全替代 JSON.parse
const jsonRegex = /^[\],:{}\s]*$/;
return jsonRegex.test(str.replace(/\\["\\\/bfnrtu]/g, '@')
.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']')
.replace(/(?:^|:|,)(?:\s*\[)+/g, ''));
}
// 注意:正则方法不如 JSON.parse 准确,建议作为初步筛选4. 结合多种检查的完整方案
function comprehensiveJSONCheck(str) {
// 检查是否为字符串
if (typeof str !== 'string') {
return {
isValid: false,
error: 'Input must be a string'
};
}
// 检查是否为空
if (str.trim() === '') {
return {
isValid: false,
error: 'Empty string is not valid JSON'
};
}
// 使用 JSON.parse 进行最终验证
try {
const parsed = JSON.parse(str);
return {
isValid: true,
data: parsed,
type: Array.isArray(parsed) ? 'array' : typeof parsed
};
} catch (error) {
return {
isValid: false,
error: error.message,
position: error.message.match(/position (\d+)/)?.[1]
};
}
}
// 使用示例
const results = [
comprehensiveJSONCheck('{"name": "John"}'),
comprehensiveJSONCheck('invalid json'),
comprehensiveJSONCheck('[1, 2, 3]'),
comprehensiveJSONCheck('')
];
results.forEach((result, index) => {
console.log(`Test ${index + 1}:`, result);
});5. 在实际应用中的使用
// 处理 API 响应
async function fetchAndValidateJSON(url) {
try {
const response = await fetch(url);
const text = await response.text();
const validation = validateJSON(text);
if (!validation.isValid) {
throw new Error(`Invalid JSON: ${validation.error}`);
}
return validation.data;
} catch (error) {
console.error('JSON validation failed:', error);
throw error;
}
}
// 表单输入验证
function validateJSONInput(inputElement) {
const value = inputElement.value;
const validation = validateJSON(value);
if (validation.isValid) {
inputElement.style.borderColor = 'green';
return validation.data;
} else {
inputElement.style.borderColor = 'red';
inputElement.title = `JSON Error: ${validation.error}`;
return null;
}
}主要注意事项
JSON.parse()是最可靠的方法 - 它严格遵循 JSON 规范错误处理很重要 - 使用 try-catch 来捕获解析错误
空字符串不是有效的 JSON -
JSON.parse('')会抛出错误单值也是有效的 JSON - 如
123,"string",true,null都是有效的考虑性能 - 对于大量数据的校验,要注意性能影响
推荐使用第一种基于 JSON.parse() 的方法,因为它最准确且性能良好。