javascript如何解析与生成JSON数据【教程】

6次阅读

javaScript中jsON.parse()和json.Stringify()是原生方法,但parse易因单引号、尾逗号、undefined等报错,需trycatch;stringify会静默忽略undefined/function/symbol,BigInt抛错,循环引用直接报错,需replacer或工具处理。

javascript如何解析与生成JSON数据【教程】

javascript 里解析和生成 JSON 数据,靠的是原生的 JSON.parse()JSON.stringify(),不需要额外库,但用错地方或传错参数就会立刻报错。

JSON.parse() 解析失败的常见原因

不是所有字符串都能被 JSON.parse() 正确处理,最典型的是单引号、尾逗号、注释、undefined 或函数 —— 这些都不是合法 JSON。

  • 错误示例:JSON.parse("{'name': 'Alice'}")(单引号 → 报 SyntaxError: Unexpected Token '
  • 错误示例:JSON.parse('{"age": 25,}') (尾逗号 → 同样 SyntaxError)
  • 错误示例:JSON.parse('{"x": undefined}') (undefined 不是 JSON 值 → 报错)
  • 安全做法:始终用 try...catch 包裹,尤其处理用户输入或第三方 API 返回时

正确写法:JSON.parse('{"name": "Alice", "age": 25}') // → {name: "Alice", age: 25}

JSON.stringify() 会静默丢数据的几种情况

JSON.stringify() 对某些 JS 类型不做序列化,也不报错,容易造成数据“消失”而不自知。

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

  • undefinedfunctionSymbol对象属性中会被直接忽略
  • console.log(JSON.stringify({a: undefined, b: () => {}, c: Symbol('x')})) // → "{}"
  • date 对象会被转成 ISO 字符串:JSON.stringify({t: new Date(2023, 0, 1)}) // → '{"t":"2023-01-01T00:00:00.000Z"}'
  • BigInt 会直接抛 TypeError: Do not know how to serialize a BigInt

如何安全地处理循环引用或特殊类型

原生 JSON.stringify() 遇到循环引用(比如 obj.a = obj)会直接报错:TypeError: Converting circular structure to JSON。没内置解决方案,得自己干预。

  • 简单过滤:用 replacer 函数跳过 problematic key:JSON.stringify(obj, (key, val) => typeof val === 'function' ? undefined : val)
  • 检测循环:需手动维护已访问对象 Set,或用现成小工具flattedcycle
  • 日期/大数等类型建议统一在序列化前做标准化转换,比如把 BigInt 转成 String,再在解析侧还原

浏览器node.js 的兼容性差异很小,但要注意空值处理

JSON.parse(NULL) 返回 null,但 JSON.parse(undefined) 会报错;JSON.stringify(null) 返回字符串 "null",而 JSON.stringify(undefined) 返回 undefined(不是字符串!)。

  • 这个差异在写通用工具函数时容易漏掉,比如:const safeParse = s => s == null ? null : JSON.parse(s)
  • node.js 早期版本(JSON.stringify 处理 NaN/Infinity 返回 null,现代环境统一为 "null",但业务中仍建议提前过滤

真正麻烦的从来不是“怎么调用”,而是“谁给的数据不可信”以及“哪些 JS 值根本不在 JSON 规范里”。多一层校验,比事后 debug 强得多。

text=ZqhQzanResources