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

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免费学习笔记(深入)”;
本书是全面讲述PHP与MySQL的经典之作,书中不但全面介绍了两种技术的核心特性,还讲解了如何高效地结合这两种技术构建健壮的数据驱动的应用程序。本书涵盖了两种技术新版本中出现的最新特性,书中大量实际的示例和深入的分析均来自于作者在这方面多年的专业经验,可用于解决开发者在实际中所面临的各种挑战。 本书内容全面深入,适合各层次PHP和MySQL开发人员阅读,既是优秀的学习教程,也可用作参考手册。
-
undefined、function、Symbol在对象属性中会被直接忽略 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,或用现成小工具如
flatted、cycle库 - 日期/大数等类型建议统一在序列化前做标准化转换,比如把
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 强得多。










