javascript JSON是什么_如何解析和生成JSON数据

JSON是一种轻量级数据交换格式,语法源于JS对象字面量,键名和字符串值必须用双引号,仅支持字符串、数字、布尔值、null、数组、对象;解析用JSON.parse()(需try-catch),序列化用JSON.stringify()(忽略函数/undefined等)。

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,不是 JavaScript 的专属,但语法源于 JS 对象字面量。它以纯文本形式存储和传输数据,结构清晰、易读易写,被几乎所有编程语言支持。

JSON 的基本规则

JSON 有严格的语法规则,常见错误多源于忽略这些细节:

  • 键名必须用双引号包裹("name" ✅,name ❌)
  • 字符串值必须用双引号("hello" ✅,'hello'hello ❌)
  • 不支持单引号、注释、undefined、函数、NaN、Infinity 或日期对象(需转为字符串或时间戳)
  • 只允许以下类型:字符串、数字、布尔值(true/false)、null、数组、对象

如何解析 JSON 字符串(JSON → JavaScript 值)

使用 JSON.parse() 将符合规范的 JSON 字符串转为 JS 对象或数组:

const jsonStr = '{"name":"张三","age":28,"isActive":true}';
const data = JSON.parse(jsonStr);
console.log(data.name); // "张三"
console.log(data.age);  // 28

⚠️ 注意:若字符串格式非法,JSON.parse() 会直接抛出 SyntaxError。建议加 try-catch:

try {
  const data = JSON.parse(input);
} catch (err) {
  console.error('JSON 解析失败:', err.message);
}

如何生成 JSON 字符串(JavaScript 值 → JSON)

使用 JSON.stringify() 将 JS 对象、数组等可序列化值转为 JSON 字符串:

const user = { name: "李四", scores: [85, 92], joined: new Date() };
const jsonStr = JSON.stringify(user);
// {"name":"李四","scores":[85,92],"joined":"2025-06-15T08:23:10.123Z"}

⚠️ 注意:无法序列化的属性(如函数、undefined、Symbol、循环引用)会被自动忽略;Date 对象会转为 ISO 字符串;可传入第二个参数(replacer)定制字段,第三个参数(space)美化输出:

JSON.stringify({a: 1, b: 2}, null, 2);
// 换行缩进,便于阅读

常见坑与应对建议

  • 后端返回的响应体是字符串?别忘了先 JSON.parse() —— fetch 或 axios 默认不会自动解析
  • JSON.stringify(obj) === JSON.stringify(other) 比较对象?不可靠(顺序、空格、类型隐式转换都影响结果),应使用深比较工具或手动比对
  • 处理用户输入的 JSON?务必 try-catch,绝不假设输入合法
  • 需要保存复杂数据(如 Map、Set、自定义类实例)?JSON 不支持,得先转换为 plain object 数组,或改用其他序列化方式(如 structuredClone + 自定义序列化逻辑)