深入理解qs库:简化你的工作流程

前言

vue 开发中,处理 url 查询字符串是一个常见的任务。qs 库是一个流行的工具,可以帮助我们轻松地处理 url 查询字符串的编码和解码。本文将介绍 qs 库的基本用法,并结合实例演示帮助你更好地理解和应用这个实用的工具。


一、qs 是什么?

qs 是一个 node.js 和浏览器中的 url 查询字符串解析和序列化库。它可以将 JavaScript 对象转换为 url 查询字符串,也可以将 url 查询字符串解析为 JavaScript 对象。qs 库支持多种编码格式,包括 application/x-www-form-urlencodedmultipart/form-data 等。它还提供了一些高级功能,例如解析嵌套对象和数组、自定义编码和解码函数等。qs 库易于使用,广泛应用于 web 开发中的 url 查询字符串处理。


二、安装

  • 安装

    npm i qs
    
  • 局部引入

    import qs from 'qs'
    
  • 全局引入

    import qs from 'qs'
    Vue.prototype.$qs = qs //使用时直接 this.$qs
    

三、使用

我们在使用 qs 库时,两个最常用的方法是 stringifyparse。下面我将详细介绍这两个方法的作用和用法:

3.1 stringify 方法

  • 作用:将 JavaScript 对象序列化为 url 查询字符串

  • 用法:qs.stringify(object, [options])

  • 参数:

    • object:要序列化的 JavaScript 对象
    • options(可选):一个包含序列化选项的对象
  • 返回值:序列化后的 url 查询字符串

实例

在下面的实例中,stringify 方法将 obj 对象序列化为 url 查询字符串。

mounted() {
  const obj = { foo: "bar", baz: ["qux", "quux"], corge: "" };
  const queryString = qs.stringify(obj);
  console.log(queryString);
},

控制台打印

在这里插入图片描述


3.2 parse 方法

  • 作用:将 url 查询字符串解析为 JavaScript 对象
  • 用法:qs.parse(str, [options])
  • 参数:
    • str:要解析的URL查询字符串
    • options(可选):一个包含解析选项的对象
  • 返回值:解析后的 JavaScript 对象

实例

在下面的实例中,parse 方法将 queryString 解析为 JavaScript 对象。

mounted() {
  const queryString = "foo=bar&baz%5B0%5D=qux&baz%5B1%5D=quux&corge=";
  const obj = qs.parse(queryString);
  console.log(obj);
},

控制台打印
在这里插入图片描述


四、qs 的高级用法

4.1 解析嵌套对象(深度序列化)

qs 库可以解析嵌套对象,将查询字符串转换为嵌套的 JavaScript 对象。

mounted() {
  const queryString = "user[name]=John&user[age]=25";
  const parsed = qs.parse(queryString, { depth: 1 });
  console.log(parsed); // 输出:{ user: { name: 'John', age: '25' } }
},

其中,depth 选项用于指定解析嵌套对象时的最大深度。它控制了解析过程中嵌套对象的层级数。默认情况下,depth 选项的值为 5,表示 qs 库将解析最多 5 层的嵌套对象。如果查询字符串中的嵌套对象超过了指定的深度,qs 库将停止解析并将其视为字符串。通过调整 depth 选项的值,可以控制 qs 库解析嵌套对象的深度。例如,将 depth 设置为 1,则只解析一层嵌套对象,超过一层的嵌套对象将被视为字符串。


4.2 序列化数组

mounted() {
  const arr = ["apple", "banana", "cherry"];
  const serialized = qs.stringify({ fruits: arr }, { arrayFormat: "indices" });
  console.log(serialized); // 输出:fruits=apple&fruits=banana&fruits=cherry
},

在这个例子中,fruits 是一个对象的属性名,它表示一个包含水果名称的数组。arrayFormatqs.stringify 方法的选项之一,用于控制数组的序列化方式。

  • arrayFormat 选项有以下几种取值:

    indices:默认值。数组的值将使用索引作为后缀进行命名,例如 fruits[0]=apple&fruits[1]=banana&fruits[2]=cherry
    brackets:数组的值将使用方括号进行命名,例如 fruits[]=apple&fruits[]=banana&fruits[]=cherry
    repeat:数组的值将重复出现在查询字符串中,例如 fruits=apple&fruits=banana&fruits=cherry


4.3 自定义序列化函数

mounted() {
  const obj = {
    a: "value1",
    b: "value2",
    date: new Date(),
  };
  const serialized = qs.stringify(obj, {
    serializeDate: (i) => {
      const year = i.getFullYear();
      const month = String(i.getMonth() + 1).padStart(2, "0");
      const day = String(i.getDate()).padStart(2, "0");
      return `${year}-${month}-${day}`;
    },
  });
  console.log(serialized); // 输出:a=value1&b=value2&date=2023-12-21
},

在这个示例中,我们使用 qs.stringify 方法将 obj 对象序列化为 url 查询字符串的形式。在这个过程中,我们传递了一个选项对象作为第二个参数,并定义了一个名为 serializeDate 的自定义序列化函数。在 serializeDate 函数中,我们使用方法将日期对象转换为 YYYY-MM-DD 格式的字符串。


4.4 自定义解析函数

mounted() {
  const str = "a=value1&b=value2&date=2022-12-12";
  const parsed = qs.parse(str, {
    parseDate: (value) => {
      const parts = value.split("-");
      const year = Number(parts[0]);
      const month = Number(parts[1]) - 1;
      const day = Number(parts[2]);
      return new Date(year, month, day);
    },
  });
  console.log(parsed); // 输出:{a: 'value1', b: 'value2', date: '2022-12-12'}
},

在这个示例中,我们使用 qs.parse 方法将 str 字符串解析为一个对象。在这个过程中,我们传递了一个选项对象作为第二个参数,并定义了一个名为 parseDate 的自定义解析函数。在 parseDate 函数中,我们首先使用 split 方法将日期字符串按照 - 分割成三个部分,分别表示年份、月份和日期。然后,我们将这三个部分转换为数字,并使用 new Date 构造函数创建一个新的日期对象。


4.5 忽略特定属性

mounted() {
  const str = "foo_a=value1&foo_b=value2&c=value3";
  const parsed = qs.parse(str);
  // 忽略以 'foo_' 前缀开头的属性
  const filtered = Object.keys(parsed).reduce((acc, key) => {
    if (!key.startsWith("foo_")) {
      acc[key] = parsed[key];
    }
    return acc;
  }, {});
  console.log(filtered); // 输出:{c: 'value3'}
},

在这个示例中,我们首先使用 qs.parse 方法解析查询字符串 str,得到一个解析后的结果对象 parsed。然后,我们使用 Object.keys 方法遍历 parsed 对象的属性,并通过 reduce 方法进行过滤。对于不以 foo_ 前缀开头的属性,我们将其添加到一个新的对象 filtered 中。


五、qs.stringify 和 JSON.stringify 的区别

相同点

qsJSON 都可以进行序列化。

不同点

  • 数据格式:

    qs.stringifyqs 库提供的方法,用于将 JavaScript 对象序列化为 url 查询字符串的格式;
    JSON.stringifyJavaScript 内置的方法,用于将 JavaScript 对象序列化为 JSON 字符串的格式。

  • 序列化规则:

    qs.stringify 会对对象的属性进行 url 编码,并使用等号(=)连接属性名和属性值,使用与号(&)连接不同的属性;
    JSON.stringify 会将对象的属性和值转换为字符串,并按照 JSON 格式进行序列化,属性名会被包裹在双引号中。

使用 qs.stringify 的示例代码:

mounted() {
  const data = {
    name: "John Doe",
    age: 25,
    city: "New York",
  };
  const queryString = qs.stringify(data);
  console.log(queryString);
  // 输出:name=John%20Doe&age=25&city=New%20York
},

使用 JSON.stringify 的示例代码:

mounted() {
  const data = {
    name: "John Doe",
    age: 25,
    city: "New York",
  };
  const jsonString = JSON.stringify(data);
  console.log(jsonString);
  // 输出:{"name":"John Doe","age":25,"city":"New York"}
},

六、JSON

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,常用于数据的序列化、存储和传输。它以简洁、易读的文本格式表示结构化的数据,通常由键值对组成。通过 JSON.parse()JSON.stringify() 方法可以实现 JSON 字符串和 JavaScript 对象之间的转换。

6.1 JSON.parse() 方法

JSON 字符串解析为 JavaScript 对象。

示例代码:

mounted() {
  const jsonString = '{"name":"John Doe","age":25}';
  const obj = JSON.parse(jsonString);
  console.log(obj.name); // 输出:John Doe
},

6.2 JSON.stringify() 方法

JavaScript 对象序列化为 JSON 字符串。

示例代码:

mounted() {
  const obj = { name: "John Doe", age: 25 };
  const jsonString = JSON.stringify(obj);
  console.log(jsonString); // 输出:{"name":"John Doe","age":25}
},

replacer 参数

replacerJSON.stringify() 的第二个参数。用于控制序列化过程的选项。可以是一个函数或数组,用于过滤和转换要序列化的对象的属性。

示例代码:

mounted() {
  const obj = { name: "John Doe", age: 25, city: "New York" };
  const jsonString = JSON.stringify(obj, ["name", "age"]);
  console.log(jsonString); // 输出:{"name":"John Doe","age":25}
},

space 参数

spaceJSON.stringify() 的第三个参数。用于控制输出的缩进和格式化,它可以是一个数字或字符串。

space 参数是一个数字时,表示缩进的空格数。例如,space2 时,输出的 JSON 字符串会进行缩进,每个层级缩进 2 个空格。

mounted() {
  const obj = { name: "John Doe", age: 25 };
  const jsonString = JSON.stringify(obj, null, 2);
  console.log(jsonString);
  // 输出:
  // {
  //   "name": "John Doe",
  //   "age": 25
  // }
},

space 参数是一个字符串时,表示用于缩进的字符串。例如,space"\t" 时,输出的 JSON 字符串会使用制表符进行缩进。

const obj = { name: 'John Doe', age: 25 };
const jsonString = JSON.stringify(obj, null, "\t");
console.log(jsonString);
// 输出:
// {
//     "name": "John Doe",
//     "age": 25
// }

如果 space 参数是一个非数字且非字符串的值,例如 null,则表示不进行缩进,输出的 JSON 字符串将没有额外的空格。

const obj = { name: 'John Doe', age: 25 };
const jsonString = JSON.stringify(obj, null, null);
console.log(jsonString);
// 输出:{"name":"John Doe","age":25}


异常处理

JSON.parse()JSON.stringify() 的异常处理。在解析或序列化过程中,如果遇到无效的 JSON 字符串,会抛出 SyntaxError 异常。

mounted() {
  try {
    const jsonString = '{"name":"John Doe","age":}';
    const obj = JSON.parse(jsonString);
    console.log(obj);
  } catch (error) {
    console.error(error);
  }
},

控制台打印

在这里插入图片描述


相关推荐

⭐ 浅谈 JSON 对象和 FormData 相互转换,打通前端与后端的通信血脉

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/265235.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于SSM的文化线上体验馆(有报告)。Javaee项目。ssm项目。

演示视频: 基于SSM的文化线上体验馆(有报告)。Javaee项目。ssm项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构,通过Spring SpringMvc MybatisVueLayu…

字符设备驱动开发-注册-设备文件创建

一、字符设备驱动 linux系统中一切皆文件 1、应用层: APP1 APP2 ... fd open("led驱动的文件",O_RDWR); read(fd); write(); close(); 2、内核层: 对灯写一个驱动 led_driver.c driver_open(); driver_read(); driver_write(…

09、基于LunarLander登陆器的Dueling DQN强化学习(含PYTHON工程)

09、基于LunarLander登陆器的Dueling DQN强化学习(含PYTHON工程) 参考: 论文地址:https://proceedings.mlr.press/v48/wangf16.pdf LunarLander复现: 07、基于LunarLander登陆器的DQN强化学习案例(含PYT…

Java之ArrayList源码解读

ArrayList源码解读 ArrayList ArrayList 的底层是数组队列,相当于动态数组。与 Java 中的数组相比,它的容量能动态增长。在添加大量元素前,应用程序可以使用ensureCapacity操作来增加 ArrayList 实例的容量。这可以减少递增式再分配的数量。…

SwiftUI 趣谈之:绝不可能(Never)的 View!

概览 SwiftUI 的出现极大的解放了秃头码农们的生产力。SwiftUI 中众多原生和自定义视图对于我们创建精彩撩人的 App 功不可没! 不过,倘若小伙伴们略微留意过 SwiftUI 框架头文件里的源代码,就会发现里面嵌有一些奇怪 Never 类型&#xff0c…

Unity中Shader旋转矩阵(二维旋转矩阵)

文章目录 前言一、旋转矩阵的原理1、我们以原点为中心,旋转坐标轴θ度2、求 P~2x~:3、求P~2y~:4、最后得到 P~2~点 的点阵5、该点阵可以拆分为以下两个矩阵相乘的结果 二、在Shader中,使用该旋转矩阵实现围绕 z 轴旋转1、在属性面板定义 floa…

信号与线性系统翻转课堂笔记8——周期信号的频谱

信号与线性系统翻转课堂笔记8——周期性信号的频谱 The Flipped Classroom8 of Signals and Linear Systems 对应教材:《信号与线性系统分析(第五版)》高等教育出版社,吴大正著 一、要点 (1,重点&#…

nodejs+vue+微信小程序+python+PHP基于推荐算法的电影推荐系统-计算机毕业设计推荐django

信息数据的处理完全依赖人工进行操作,会耗费大量的人工成本,特别是面对大量的数据信息时,传统人工操作不仅不能对数据的出错率进行保证,还容易出现各种信息资源的低利用率与低安全性问题。更有甚者, 另一方面可以确保信…

系列八、VMWare无法启动CentOS7问题排查 解决

一、VMWare无法启动CentOS7 1.1、问题描述 今天在测试代码的时候,需要用到Linux,然后就打开VMWare进行启动,但是启动的时候发现无法启动起来,报了一个如下的错误: 出现了问题那就要解决问题,然后想起来前几…

【设计模式】命令模式

其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、什么是命令模式? 二、命令模式的优点和应用场景 三、命令模式的要素和实现 3.1 命令 3.2 具体命令 3.3 接受者 …

Flink快速部署集群,体验炸了!

📢📢📢📣📣📣 哈喽!大家好,我是【IT邦德】,江湖人称jeames007,10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】!😜&am…

反序列化版本漏洞

laravel5.7反序列化漏洞 <?phpnamespace Illuminate\Foundation\Testing {class PendingCommand{public $test;protected $app;protected $command;protected $parameters;public function __construct($test, $app, $command, $parameters){$this->test $test; …

【MVT_1703230471】基于Python NLTK分词、词云、LDA主题分类及GPT情感分类

【Talk is cheap】 1 数据探索 case idcase outcome case title case text 0 Case1 cited Alpine Hardwood (Aust) Pty Ltd v Hardys Pty Lt... Ordinarily that discretion will be exercised s... 1 Case2 cited Black v Lipovac [1998] FCA 699 ; (1998) 217 AL... The gen…

tsconfig.app.json文件报红:Option ‘importsNotUsedAsValues‘ is deprecated...

在创建vue3 vite ts项目时的 tsconfig.json&#xff08;或者tsconfig.app.json&#xff09; 配置文件经常会报一个这样的错误&#xff1a; 爆红&#xff1a; Option ‘importsNotUsedAsValues’ is deprecated and will stop functioning in TypeScript 5.5. Specify compi…

【内存泄漏】编码实现内存泄漏检测功能

编码实现内存泄漏检测功能 使用脚本统计 meminfo 判断是否有内存泄漏 使用 bash 或 python 脚本循环抓取指定进程的 meminfo 保存到 txt 文件&#xff1b;使用 python 脚本解析出txt 文件中的 PSS 信息&#xff0c;借助 pyecharts 或其他可视化三方库将数据以折线图可视化&am…

【Earth Engine】协同Sentinel-1/2使用随机森林回归实现高分辨率相对财富(贫困)制图

目录 1 简介与摘要2 思路3 效果预览4 代码思路5 完整代码6 后记 1 简介与摘要 最近在做一些课题&#xff0c;需要使用Sentinel-1/2进行机器学习制图。 然后想着总结一下相关数据和方法&#xff0c;就花半小时写了个代码。 然后再花半小时写下这篇博客记录一下。 因为基于多次拍…

学校和老师如何制作自己免费的成绩查询系统

在当今数字化的时代&#xff0c;许多学校都采用信息技术来管理和提高工作效率。其中&#xff0c;成绩查询系统是一个非常实用的工具&#xff0c;它可以让老师和学生们快速、方便地查询成绩。那么&#xff0c;学校和老师如何制作自己免费的成绩查询系统呢&#xff1f;本文将为你…

【Amazon 实验①】使用 Amazon CloudFront加速Web内容分发

文章目录 实验架构图1. 准备实验环境2. 创建CloudFront分配、配置动、静态资源分发2.1 创建CloudFront分配&#xff0c;添加S3作为静态资源源站2.2 为CloudFront分配添加动态源站 在本实验——使用CloudFront进行全站加速中&#xff0c;将了解与学习Amazon CloudFront服务&…

Python办公自动化Day1

目录 文章声明⭐⭐⭐让我们开始今天的学习吧&#xff01;xlwt创建Excelxlrd读取Excelxlutils修改Excelxlwt设置样式常见的字体样式单元格宽高内容对齐方式设置单元格边框设置背景颜色样式整合起来的写法 文章声明⭐⭐⭐ 该文章为我&#xff08;有编程语言基础&#xff0c;非编…

RabbitMQ笔记(高级篇)

RabbitMQ笔记_高级篇 问题代码准备1. 新建生产者2. 新建消费者 RabbitMQ 高级特性1. 消息的可靠投递☆1.1 两种模式1.2 测试confirm 确认模式1.3 测试return 退回模式1.4 小结 2. Consumer ACK☆2.1 三种ACK2.2 测试手动ACK2.3 小结2.4 消息可靠性总结 3. 消费端限流测试消费端…