javascript如何操作JSON数据_序列化和解析有何要点【教程】
技术百科
夢幻星辰
发布时间:2026-01-27
浏览: 次 JSON.stringify() 会悄悄丢数据:忽略函数、undefined、Symbol键、BigInt,循环引用报错;JSON.parse() 仅接受严格JSON格式,不执行代码但需校验结构;日期等非标类型须手动转换。
JSON 序列化和解析在 JavaScript 中几乎零成本,但错用 JSON.stringify() 或 JSON.parse() 会导致静默失败、数据丢失甚至安全漏洞。
什么时候 JSON.stringify() 会悄悄丢数据?
它不处理函数、undefined、Symbol、BigInt 和循环引用——这些值会被

-
undefined和函数:在对象中被跳过({ a: 1, b: undefined, c: () => {} }→{"a":1}) - Symbol 键:整个键值对消失(
{ [Symbol('x')]: 'y' }→{}) - 循环引用:直接抛
TypeError: Converting circular structure to JSON - BigInt:抛
TypeError: Do not know how to serialize a BigInt
若需保留函数或处理循环,得自己实现序列化逻辑(如用 structuredClone() + 自定义 replacer),不能依赖原生 JSON.stringify()。
JSON.parse() 的安全边界在哪?
它只接受严格 JSON 格式字符串(双引号键名、无尾逗号、无注释、无单引号)。常见错误包括:
- 用单引号代替双引号:
JSON.parse("{'a':1}")→ 报错 - 尾逗号:
JSON.parse('{"a":1,}') → SyntaxError - undefined 或 NaN 字面量:
JSON.parse('{"x":undefined}') → SyntaxError - 执行任意代码?不会。原生
JSON.parse() 不解析表达式,比eval()安全得多
但注意:如果输入来自不可信来源,仍需校验结构(比如用 zod 或 io-ts 做运行时类型检查),因为合法 JSON 也可能含恶意字段。
如何安全地处理日期、Map、Set 等非标准类型?
JSON 规范不支持它们,必须手动转换:
- 日期:用
replacer转成 ISO 字符串,reviver中还原:JSON.stringify(new Date(), (k, v) => v instanceof Date ? v.toISOString() : v)
- Map/Set:先转为数组格式(
[...map]),解析后再用构造函数重建 - 自定义类实例:
JSON.stringify(obj)只序列化自有可枚举属性,不保留原型链;恢复时需手动 new 实例并赋值
别指望 JSON.parse() 自动识别类型——它永远只返回 plain object/array/null/number/string/boolean。
性能与兼容性要注意什么?
JSON.stringify() 和 JSON.parse() 是 V8 引擎高度优化的原生方法,比手写解析快一个数量级,但仍有细节影响表现:
- 深层嵌套对象:可能触发栈溢出(尤其在旧版 Safari),建议限制深度或用流式解析库(如
jsonparse) - 超大字符串(>10MB):阻塞主线程,考虑 Web Worker 中解析
- IE8+ 支持原生 JSON,但 IE7 及更早需引入
json2.js垫片 -
replacer函数若做复杂计算,会显著拖慢stringify速度,避免在其中调用 API 或深克隆
真正容易被忽略的是:JSON.stringify(undefined) 返回 "undefined"(字符串),而 JSON.stringify([undefined]) 返回 "[null]" —— 同一值在不同上下文行为不一致,写条件判断时得格外小心。
# ai
# safari
# js
# json
# 循环
# javascript
# java
# String
# 构造函数
# 字符串
# 线程
# 栈
# red
# 数据丢失
# 键值对
# NULL
# map
# Object
# 主线程
# Array
# Boolean
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- Windows系统被恶意软件破坏后的恢复策略_错误
- c++怎么使用std::unique实现去重_c+
- Win11怎么设置默认浏览器Chrome_Wind
- php删除数据怎么清空表_truncate与del
- 如何使用Golang开发基础文件下载功能_Gola
- php修改数据怎么改富文本_update更新htm
- Win11怎么设置多显示器任务栏 Win11扩展任
- Golang如何测试HTTP中间件_Golang
- Python高性能计算项目教程_NumPyCyth
- Python数据挖掘核心算法实践_聚类分类与特征工
- Win11怎么关闭小组件_Win11禁用任务栏天气
- Win11怎么开启智能存储_Windows11存储
- Windows10如何更改开机密码_Win10登录
- Win11触摸板没反应怎么办_开启Win11笔记本
- Win11怎么设置开机问候语_自定义Win11锁屏
- 如何在 Laravel 中通过嵌套关联关系进行 o
- 如何使用Golang指针与接口结合_实现方法调用和
- php条件判断怎么写_ifelse和switchc
- Linux怎么查找死循环进程_Linux系统负载分
- Win11怎么关闭自动更新 Win11永久关闭系统
- Windows如何拦截腾讯视频广告_Windows
- Python函数接口文档化_自动化说明【指导】
- Win11怎样安装搜狗输入法_Win11安装搜狗输
- Win10怎么设置开机密码_Windows10账户
- 如何优化Golang Web性能_Golang H
- Go 语言标准库为何不提供泛型切片的 Contai
- Win10如何卸载WindowsDefender_
- Win11怎么开启游戏工具栏_Windows11
- Mac如何将HEIC图片格式转为JPG_Mac批量
- Python并发安全问题_资源竞争说明【指导】
- Win10怎么查看内存时序参数_Win10CPU-
- Windows10系统怎么查看CPU核心数_Win
- Win10如何备份注册表_Win10注册表备份步骤
- c# F# 的 MailboxProcessor
- c++如何打印函数堆栈信息_c++ backtra
- Win11如何设置环境变量 Win11添加和修改系
- 如何在 Go 中正确初始化结构体中的 map 字段
- Go 中实现 Python urllib.quot
- Windows11怎么用“记事本”自动换行与编码
- c++如何用AFL++进行模糊测试 c++ Fuz
- VSC怎样在Linux运行PHP_Ubuntu系统
- Python类装饰器使用_元编程解析【教程】
- Windows10如何更改鼠标灵敏度_Win10鼠
- 如何在 PHP 单元测试中正确模拟带方法的图像处理
- C++如何获取CPU核心数?(std::threa
- 如何高效识别并拦截拼接式恶意域名 spam
- php订单日志怎么记录评价_php记录订单评价日志
- php打包exe后无法读取环境变量_变量配置方法【
- Win11如何更改任务栏颜色 Win11自定义任务
- Python网页解析流程_html结构说明【指导】

QQ客服