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;
  }
}

主要注意事项

  1. JSON.parse() 是最可靠的方法 - 它严格遵循 JSON 规范

  2. 错误处理很重要 - 使用 try-catch 来捕获解析错误

  3. 空字符串不是有效的 JSON - JSON.parse('') 会抛出错误

  4. 单值也是有效的 JSON - 如 123"string"truenull 都是有效的

  5. 考虑性能 - 对于大量数据的校验,要注意性能影响

推荐使用第一种基于 JSON.parse() 的方法,因为它最准确且性能良好。