什么是JSON_如何在javascript中解析和生成

17次阅读

jsON是轻量级数据交换格式,非编程语言,语法独立于语言但类似javaScript对象字面量;要求双引号、无注释、顶层仅ObjectArrayjson.parse()严格校验,JSON.stringify()忽略undefined/function并丢失类型信息。

什么是JSON_如何在javascript中解析和生成

JSON 不是一种编程语言,而是一种轻量级的数据交换格式,语法独立于语言,但与 javascript 的对象字面量高度相似。它被设计为易读、易解析、易生成,几乎所有现代语言都原生支持 JSON。

JSON 的基本语法规则

JSON 数据必须是字符串形式,且只允许使用双引号包裹键名和字符串值;不允许注释、尾随逗号、undefined、函数、date 对象或 regexp 实例。合法的顶层结构只能是 object(花括号)或 array(方括号)。

常见错误包括:

  • 用单引号代替双引号:{'name': 'Alice'} ❌(应为 {"name": "Alice"}
  • 键名没加引号:{name: "Alice"} ❌(JSON 要求所有键必须是双引号字符串)
  • 包含 undefinedfunction():会被 JSON.stringify() 忽略或抛错

JSON.parse():把字符串转成 JavaScript 值

该方法严格校验输入——只要字符串不符合 JSON 语法,就会立即抛出 SyntaxError。不能用于解析任意 JS 对象字面量(比如带单引号或省略引号的)。

立即学习Java免费学习笔记(深入)”;

实操建议:

  • 始终用 try...catch 包裹,避免未捕获异常导致程序中断
  • 服务端返回的响应体(如 fetch().then(r => r.json()))内部已调用 JSON.parse(),无需重复解析
  • 如果需要处理非标准格式(如带注释的配置),先用正则或专用库清洗,再传给 JSON.parse()
try {   const data = JSON.parse('{"user": {"id": 42, "active": true}}');   console.log(data.user.id); // 42 } catch (err) {   console.error('解析失败:', err.message); }

JSON.stringify():把 JavaScript 值转成 JSON 字符串

它只序列化可枚举的自有属性,会跳过 undefinedfunctionsymbol 值,以及循环引用的对象(直接抛 TypeError)。

关键参数说明:

  • 第二个参数 replacer 可以是数组(指定白名单字段)或函数(自定义序列化逻辑)
  • 第三个参数 space 控制缩进,传数字(空格数)或字符串(如 "t")用于美化输出
  • 日期对象会被自动转为 ISO 字符串:new Date("2023-01-01")"2023-01-01T00:00:00.000Z"
const obj = { name: "Bob", age: 30, createdAt: new Date() }; console.log(JSON.stringify(obj, NULL, 2)); // 输出: // { //   "name": "Bob", //   "age": 30, //   "createdAt": "2023-01-01T00:00:00.000Z" // }

容易被忽略的边界情况

实际项目中,最常踩的坑不是语法错误,而是类型隐式转换和数据完整性丢失:

  • JSON.stringify(new Date()) 得到字符串,但 JSON.parse() 不会把它变回 Date 对象——需要手动转换
  • JSON.stringify({ x: undefined }) 返回 {},字段直接消失,而不是保留 "x": null
  • BigNumber、map、Set、TypedArray 等无法被原生 JSON.stringify() 处理,需提前转为普通对象或数组
  • 后端约定的字段名大小写不一致(如后端返回 user_id前端期望 userId),靠 JSON 本身无法解决,得在解析后做映射

text=ZqhQzanResources