javascript如何操作JSON_如何解析和序列化【教程】

发布时间 - 2026-01-30 00:00:00    点击率:
JSON操作核心是JSON.parse()和JSON.stringify(),需防范非字符串输入、BOM字符、循环引用、特殊值丢失等问题,replacer/reviver是安全扩展点,严格遵循JSON规范(双引号、无尾逗号)。

JavaScript 里操作 JSON 几乎没有“教程”这回事——JSON.parse()JSON.stringify() 就是全部核心,但用错地方、传错参数、忽略边界情况,才是实际出问题的根源。

JSON.parse() 报错:Unexpected token 或 Unexpected end of JSON input

这是最常见的解析失败,本质不是语法错误,而是传入了非字符串、空值、或带 BOM/不可见字符的字符串。

  • JSON.parse(null)JSON.parse(undefined) 直接抛 TypeError;必须确保输入是 string 类型,可用 typeof input === 'string' && input.trim() 防御
  • 后端返回空响应体("")或只含空白符("\n\t "),JSON.parse(" ") 会报 Unexpected token
  • 某些 API 返回带 UTF-8 BOM 的 JSON(如 \ufeff{"a":1}),需先用 str.replace(/^\uFEFF/, '') 清除
  • 不要对已解析对象再调用 JSON.parse(),比如 JSON.parse(JSON.parse('{"x":1}')) 必然失败

JSON.stringify() 输出 undefined、null 或丢失数据

JSON.stringify() 不是无损序列化工具,它有明确的忽略规则和类型限制。

  • 函数、undefined、Symbol 值会被**静默丢弃**:JSON.stringify({a: 1, b: () => {}, c: undefined})"{"a":1}"
  • 循环引用直接抛 TypeError: Converting circular structure to JSON,不能靠 try/catch 挺过去,得提前检测或用自定义 replacer 处理
  • Date 对象被转成 ISO 字符串,但 new Date().toJSON()JSON.stringify(new Date()) 行为一致;若需保留时间戳数字,要用 replacer 参数干预
  • JSON.stringify(undefined) 返回 undefined(不是字符串 "undefined"),常导致拼接时意外变成 "foo" + JSON.stringify(undefined) + "bar""foobar"

需要处理特殊值?别硬改 JSON,用 replacer 和 reviver

这两个参数是 JSON.stringify()JSON.parse() 唯一合法的扩展点,比写正则或手动遍历安全得多。

  • JSON.stringify(obj, (key, val) => key === 'date' ? val.getTime() : val) 可把 Date 转时间戳
  • JSON.parse(str, (key, val) => key === 'ts' ? new Date(val) : val) 可把数字时间戳还原为 Date
  • 注意:reviver 中的 this 指向父对象,且对顶层对象也调用一次(key 为空字符串),要加判断避免误处理
  • replacer 传数组可白名单字段:JSON.stringify(obj, ['id', 'name']),比传函数更轻量

浏览器和 Node.js 的兼容性基本不用操心,但要注意 JSON5 不是 JSON

ES5 就已内置 JSON 全局对象,所有现代环境都支持。真正容易混淆的是:有人拿 JSON5(支持注释、单引号、尾逗号)当 JSON 用,结果在生产环境崩。

  • JSON.parse('{ "a": 1, }') 在严格 JSON 下报错;JSON5 才允许尾逗号
  • JSON.parse("{'a': 1}") 同样非法——JSON **只认双引号**,单引号是常见误判点
  • Node.js 里 require('./config.js

    on')
    是 CommonJS 行为,底层调用的是 fs.readFileSync + JSON.parse,所以依然受 JSON 规范约束

真正难的从来不是“怎么调用”,而是你拿到的数据到底是不是 JSON 字符串、有没有被中间层悄悄改过格式、以及要不要在序列化前后做类型归一化——这些没法靠查文档解决,得看 network 面板、打日志、甚至抓包确认原始 payload。


# javascript  # java  # js  # node.js  # json  # node  # 浏览器  # 工具  # 后端  # String  # NULL  # date  # require  # try  # catch  # Token  # 字符串  # 循环 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何在阿里云完成域名注册与建站?  Java垃圾回收器的方法和原理总结  大型企业网站制作流程,做网站需要注册公司吗?  Laravel如何创建自定义Artisan命令?(代码示例)  详解Android中Activity的四大启动模式实验简述  香港服务器如何优化才能显著提升网站加载速度?  Win11怎么开启自动HDR画质_Windows11显示设置HDR选项  JavaScript如何实现类型判断_typeof和instanceof有什么区别  详解Huffman编码算法之Java实现  Laravel如何实现登录错误次数限制_Laravel自带LoginThrottles限流配置【方法】  Laravel怎么写单元测试_PHPUnit在Laravel项目中的基础测试入门  Python文本处理实践_日志清洗解析【指导】  Laravel的契約(Contracts)是什么_深入理解Laravel Contracts与依赖倒置  Laravel如何与Inertia.js和Vue/React构建现代单页应用  网易LOFTER官网链接 老福特网页版登录地址  javascript和jQuery中的AJAX技术详解【包含AJAX各种跨域技术】  js实现获取鼠标当前的位置  JavaScript如何操作视频_媒体API怎么控制播放  php静态变量怎么调试_php静态变量作用域调试技巧【解答】  专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?  绝密ChatGPT指令:手把手教你生成HR无法拒绝的求职信  如何确认建站备案号应放置的具体位置?  Laravel怎么创建自己的包(Package)_Laravel扩展包开发入门到发布  如何在IIS7中新建站点?详细步骤解析  javascript读取文本节点方法小结  手机怎么制作网站教程步骤,手机怎么做自己的网页链接?  安克发布新款氮化镓充电宝:体积缩小 30%,支持 200W 输出  Laravel API路由如何设计_Laravel构建RESTful API的路由最佳实践  制作旅游网站html,怎样注册旅游网站?  Laravel怎么使用Blade模板引擎_Laravel模板继承与Component组件复用【手册】  Internet Explorer官网直接进入 IE浏览器在线体验版网址  三星、SK海力士获美批准:可向中国出口芯片制造设备  使用spring连接及操作mongodb3.0实例  北京的网站制作公司有哪些,哪个视频网站最好?  js实现点击每个li节点,都弹出其文本值及修改  Laravel API资源(Resource)怎么用_格式化Laravel API响应的最佳实践  深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?  Laravel如何实现数据导出到PDF_Laravel使用snappy生成网页快照PDF【方案】  怎样使用JSON进行数据交换_它有什么限制  Laravel怎么实现搜索功能_Laravel使用Eloquent实现模糊查询与多条件搜索【实例】  Laravel如何安装使用Debugbar工具栏_Laravel性能调试与SQL监控插件【步骤】  学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?  如何自定义safari浏览器工具栏?个性化设置safari浏览器界面教程【技巧】  Laravel如何使用Service Container和依赖注入?(代码示例)  制作电商网页,电商供应链怎么做?  如何快速搭建个人网站并优化SEO?  JS碰撞运动实现方法详解  微信小程序 五星评分(包括半颗星评分)实例代码  如何用免费手机建站系统零基础打造专业网站?  教学论文网站制作软件有哪些,写论文用什么软件 ?