JSON与JavaScript有什么关系_如何解析和序列化数据

11次阅读

jsON是独立于javaScript的语言无关数据格式,仅支持NULLBooleannumberStringArrayObject六种类型,不支持函数、undefined等;json.parse()和JSON.stringify()是原生纯数据转换方法,严格遵循双引号、无注释、无尾逗号等语法规则。

JSON与JavaScript有什么关系_如何解析和序列化数据

JSON 是 javascript 的一个子集,但不是 JavaScript 代码

JSON(JavaScript Object Notation)语法源自 JavaScript,但它是独立的、语言无关的数据格式。它只支持 nullbooleannumberstringarrayobject 六种类型,不支持函数、undefineddateregexp循环引用。这意味着:

JSON.parse('{ "x": undefined }')

会直接报错 SyntaxError: Unexpected Token u in JSON at position 9——因为 undefined 不是合法 JSON。

JSON.parse()JSON.stringify() 是唯一标准解析/序列化方法

浏览器node.js 原生提供这两个函数,不依赖外部库。它们不执行代码、不调用构造函数、不处理原型链,纯数据转换:

  • JSON.parse() 只接受字符串输入;传入对象会抛 TypeError: JSON.parse requires a string
  • JSON.stringify() 遇到不可序列化的值(如 functionundefinedsymbol)会静默忽略该属性(对象中)或转为 null(数组中)
  • 第二个参数可传 replacer 函数或数组,用于过滤或修改键值;第三个参数可传缩进空格数(如 2),仅影响格式,不影响语义

示例:

JSON.stringify({ a: 1, b: undefined, c: () => {} }, null, 2) // 输出: // { //   "a": 1 // }

常见解析失败原因:空格、bom、单引号、尾逗号、注释

JSON 格式严格,以下写法全部非法:

  • 用单引号包裹字符串:'{"key":"value"}' → 必须双引号
  • 末尾多逗号:{"a":1,} → 解析失败
  • 含 UTF-8 BOM(uFEFF)开头的响应体 → JSON.parse() 报错 Unexpected token
  • http 响应头未设 Content-Type: application/json,但后端返回了 html 错误页(如 500 页面)→ 实际拿到的是 HTML 字符串,不是 JSON

调试建议:先 console.log(typeof data, data.slice(0, 50)) 确认是不是字符串,再检查前几个字符是否为 {[

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

需要自定义行为时,别改 JSON.parse,用封装函数处理边界

比如后端返回日期字符串 "2024-06-15T12:34:56Z",想自动转成 Date 对象;或遇到 null 字段想默认填空字符串。这时不该 monkey patch JSON.parse,而应:

  • JSON.parse(str, (key, value) => { ... }) 的 reviver 参数做类型修复
  • undefined 字段做 fallback,应在业务层处理,而非试图让 JSON.stringify 输出 undefined
  • 需序列化 DatemapSet 等类型时,必须手动在 replacer 中转换,例如:
    JSON.stringify(new Date(), (k, v) => v instanceof Date ? v.toISOString() : v)

真正容易被忽略的是:JSON 规范不定义时间、二进制、大数(BigInt)的表示方式,这些都得靠业务协议约定,不能指望解析器自动理解。

text=ZqhQzanResources