javascript如何操作JSON数据?_深入javascript JSON解析与序列化【教程】

发布时间 - 2026-01-31 00:00:00    点击率:
JavaScript操作JSON核心是JSON.parse()和JSON.stringify();eval存在XSS风险,JSON.parse()严格校验

格式;fetch后需检查response.ok再调用response.json(),避免手动parse。

JavaScript 操作 JSON 数据的核心就两件事:JSON.parse()JSON.stringify(),其他所谓“操作”都是对解析后的普通对象或数组进行的常规 JS 处理。

为什么不能直接用 eval() 或构造函数解析 JSON?

虽然 eval("{'a':1}") 在语法上可能“成功”,但这是严重安全隐患:JSON 字符串若含恶意代码(如 "{ 'a': 1, 'b': console.log('xss') }"),eval 会执行它。浏览器原生 JSON.parse() 严格校验格式,只接受标准 JSON(双引号、无尾逗号、无注释、无函数),拒绝执行任何代码。

  • JSON.parse() 要求字符串必须是合法 JSON —— 键名和字符串值必须用双引号,{'a': 1} 会报 SyntaxError: Unexpected token '
  • 遇到 undefinedfunctionSymbolBigInt 等非 JSON 类型时,JSON.stringify() 默认静默忽略它们;而 JSON.parse() 遇到非法结构直接抛错,不会尝试“修复”
  • 服务器返回的响应体是字符串,即使 Content-Type 是 application/json,也必须显式调用 JSON.parse(),否则你拿到的只是字符串,不是对象

JSON.stringify() 的三个参数怎么用?

第二个参数可以是数组(指定要序列化的属性名)或函数(自定义每个键值的处理逻辑),第三个参数控制缩进(用于可读性输出,不影响语义)。

  • 过滤字段:JSON.stringify({a: 1, b: 2, c: 3}, ['a', 'c'])"{"a":1,"c":3}"
  • 日期转 ISO 字符串:JSON.stringify({t: new Date()}, (k, v) => v instanceof Date ? v.toISOString() : v)
  • 避免循环引用错误:如果对象有自引用(如 obj.parent = obj),默认会抛 TypeError: Converting circular structure to JSON;可用 replacer 函数跳过该属性,或提前用 structuredClone()(现代环境)浅拷贝后再序列化
  • 注意:undefinedfunctionsymbol 在 key 位置会被忽略,在 value 位置会被转为 null(数组中)或完全省略(对象中)

从 fetch 到安全使用 JSON 数据的完整链路

真实场景中,JSON 操作不是孤立调用,而是嵌套在异步流程里,容易漏掉错误分支。

  • fetch() 返回 Promise,但网络失败(如离线)、HTTP 错误状态码(如 404、500)都不会自动 reject;必须手动检查 response.okresponse.status
  • response.json() 才真正调用 JSON.parse(),它返回一个 Promise,且会在解析失败时 reject(比如后端返回了 HTML 错误页却声称是 JSON)
  • 典型写法:
    fetch('/api/data')
      .then(r => {
        if (!r.ok) throw new Error(`HTTP ${r.status}`);
        return r.json();
      })
      .then(data => console.log(data))
      .catch(err => console.error('解析失败或网络异常:', err));
  • 不要写 JSON.parse(await response.text()) —— response.json() 内部已做最优处理(包括字符编码识别),且语义更清晰

真正难的从来不是调用那两个函数,而是判断什么时候该 parse、什么时候不该 parse,以及如何在嵌套异步、类型不明确、服务端不可控的情况下守住数据边界。多一次 typeof data === 'object' && data !== null 检查,比依赖文档里写的“保证返回 JSON”更可靠。


# javascript  # java  # html  # js  # json  # 编码  # 浏览器  # app  # 后端  # ai  # 状态码  # 为什么  # red  # xss  # Object  # NULL  # 构造函数  # date  # Token  # 字符串  # 循环 


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


相关推荐: 如何在云主机上快速搭建网站?  javascript基本数据类型及类型检测常用方法小结  Laravel路由怎么定义_Laravel核心路由系统完全入门指南  深圳网站制作的公司有哪些,dido官方网站?  音乐网站服务器如何优化API响应速度?  制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?  如何在IIS中新建站点并配置端口与IP地址?  网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?  Laravel怎么创建控制器Controller_Laravel路由绑定与控制器逻辑编写【指南】  Laravel API资源类怎么用_Laravel API Resource数据转换  Laravel怎么连接多个数据库_Laravel多数据库连接配置  打开php文件提示内存不足_怎么调整php内存限制【解决方案】  学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?  深圳网站制作平台,深圳市做网站好的公司有哪些?  Laravel Facade的原理是什么_深入理解Laravel门面及其工作机制  Python结构化数据采集_字段抽取解析【教程】  nginx修改上传文件大小限制的方法  如何在阿里云ECS服务器部署织梦CMS网站?  php在windows下怎么调试_phpwindows环境调试操作说明【操作】  大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?  如何确保FTP站点访问权限与数据传输安全?  中山网站制作网页,中山新生登记系统登记流程?  php结合redis实现高并发下的抢购、秒杀功能的实例  laravel怎么配置Redis作为缓存驱动_laravel Redis缓存配置教程  Laravel如何实现邮件验证激活账户_Laravel内置MustVerifyEmail接口配置【步骤】  HTML5建模怎么导出为FBX格式_FBX格式兼容性及导出步骤【指南】  网站建设整体流程解析,建站其实很容易!  如何选择PHP开源工具快速搭建网站?  微信公众帐号开发教程之图文消息全攻略  Windows10如何删除恢复分区_Win10 Diskpart命令强制删除分区  Laravel如何配置Horizon来管理队列?(安装和使用)  Laravel如何使用Vite进行前端资源打包?(配置示例)  如何挑选高效建站主机与优质域名?  JavaScript模板引擎Template.js使用详解  如何实现建站之星域名转发设置?  高防服务器租用首荐平台,企业级优惠套餐快速部署  Laravel如何使用Socialite实现第三方登录?(微信/GitHub示例)  Laravel如何记录自定义日志?(Log频道配置)  Java遍历集合的三种方式  laravel怎么为API路由添加签名中间件保护_laravel API路由签名中间件保护方法  Laravel怎么进行数据库回滚_Laravel Migration数据库版本控制与回滚操作  Laravel中DTO是什么概念_在Laravel项目中使用数据传输对象(DTO)  如何快速搭建虚拟主机网站?新手必看指南  儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?  高配服务器限时抢购:企业级配置与回收服务一站式优惠方案  简单实现jsp分页  JavaScript如何实现错误处理_try...catch如何捕获异常?  微信推文制作网站有哪些,怎么做微信推文,急?  Linux安全能力提升路径_长期防护思维说明【指导】  移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?