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是 CommonJS 行为,底层调用的是
on')
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碰撞运动实现方法详解
微信小程序 五星评分(包括半颗星评分)实例代码
如何用免费手机建站系统零基础打造专业网站?
教学论文网站制作软件有哪些,写论文用什么软件
?


