javascript与JSON如何相互转换?【教程】

7次阅读

javaScript对象jsON字符串转换仅靠json.Stringify()和JSON.parse()不够,需注意数据类型丢失、循环引用报错、特殊值(NaN/Infinity/-0转NULL)等问题。

javascript与JSON如何相互转换?【教程】

javascript 对象和 JSON 字符串之间转换,只靠 JSON.stringify()JSON.parse() 就够了,但直接套用常出错——关键在数据类型、循环引用、特殊值处理这三处。

什么时候必须用 JSON.stringify()

只有当你要把 JS 数据发给后端、存入 localStorage、写入文件或跨环境传输时,才需要转成 JSON 字符串。它不等于“格式化打印”,也不解决对象深拷贝问题。

  • JSON.stringify() 会忽略函数、undefinedsymbol 类型的键和值
  • 遇到循环引用(比如 a.b = a)直接抛错:TypeError: Converting circular structure to JSON
  • 日期对象会被转成 ISO 字符串(new date() → "2024-05-12T08:30:00.000Z"),不是毫秒数
  • 如果需要定制输出(比如过滤字段、重命名 key),用第二个参数 replacer 函数或数组,别手写拼接

为什么 JSON.parse() 常报 “Unexpected Token”?

这不是语法错误,而是输入根本不是合法 JSON:单引号、尾逗号、注释、undefined 值、浏览器控制台里直接复制的对象打印结果,都不是 JSON。

  • JSON 要求双引号包裹 key 和字符串值,{'name': 'Alice'} 是错的,{"name": "Alice"} 才对
  • 确保传入的是字符串类型——typeof data === "string",别误传对象进去
  • 后端返回的数据可能带 bom 或空白字符,用 data.trim() 再解析更稳
  • 想安全解析又不想崩,包一层 try/catch
    try { const obj = JSON.parse(str); } catch (e) { console.error('Invalid JSON:', e.message); }

JSON.stringify()JSON.parse() 能不能替代深拷贝?

能临时用,但有硬伤:会丢失原型链、正则、Date、map、Set、函数等原生类型,且无法处理循环引用。

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

  • 简单纯数据对象(仅 Object/Array/string/number/Boolean/null)可以:JSON.parse(JSON.stringify(obj))
  • regexp 的对象转完变空对象 {}new Date() 变字符串;undefined 键直接消失
  • 真正要深拷贝,优先选结构化克隆(structuredClone()chrome 98+ 支持),或专用库如 lodash 的 cloneDeep

最常被忽略的一点:JSON 规范里没有 NaN、Infinity、-0 这些值,它们在 JSON.stringify() 中会被转成 null,而 JSON.parse() 永远不会生成它们——这意味着你一旦走 JSON 流程,这些信息就不可逆地丢了。

text=ZqhQzanResources