JavaScript JSON序列化和反序列化

news/2023/6/6 3:04:28

文章目录

  • JavaScript JSON序列化和反序列化
    • 概述
    • JSON序列化
      • JSON.stringify()
        • 仅一个参数使用
        • 使用2个参数
        • 使用3个参数
        • 其他
      • 自定义toJson
        • 序列化顺序
    • 反序列化
      • JSON.parse()
        • 仅一个参数使用
        • 使用2个参数
      • eval()

JavaScript JSON序列化和反序列化

概述

JSON数据在网络传输时存在两种类型,一种是JSON对象类型,一种是JSON字符串类型,两种类型的转换涉及JSON序列化和反序列化的知识。

JSON序列化即将JSON对象处理为JSON字符串的过程,以方便数据的传输。JSON序列化可以通过两种方式来实现,一种是调用JSON对象内置的stringify()函数,一种是为对象自定义toJSON()函数。

JSON反序列化即将JSON字符串转换为JSON对象的过程,得到的结果用于在JavaScript中做逻辑处理。JSON反序列化的实现方式有两种,一种是使用JSON对象内置的parse()函数,一种是使用eval()函数。

JSON序列化

JSON.stringify()

语法

JSON.stringify(value, replacer, space)

说明

参数value:需要处理的值,可以为对象活数组。

参数replacer:可选参数。

  • 如果其值为一个函数,则表示在序列化过程中,被序列化值的每个属性都会经过该函数的处理;
  • 如果其值为一个数组,则表示只有包含在这个数组中的属性名才会被序列化到最终的JSON字符串中;
  • 如果该值为null或者未传递,则value参数对应值的所有属性都会被序列化。

参数space:可选参数。用于指定缩进用的空白字符串,美化输出。

  • 如果参数是个数字,则代表有多少个空格,上限值为10;
  • 如果该参数的值小于1,则意味着没有空格;
  • 如果参数为字符串,则取字符串的前十个字符作为空格;
  • 如果没有传入参数或者传入的值为null,将没有空格。

仅一个参数使用

var obj = {name: "xiaoming",age: 18,sex: true,address: ["广东省", "广州市"]
};var jsonStr = JSON.stringify(obj);
console.log(jsonStr); 
//{"name":"xiaoming","age":18,"sex":true,"address":["广东省","广州市"]}

使用2个参数

var obj = {name: "xiaoming",age: 18,sex: true,address: ["广东省", "广州市"]
};function replacerFn(key, value) {if (typeof value === "string") {return value.toUpperCase();}return value;
}var jsonStr = JSON.stringify(obj, replacerFn);
console.log(jsonStr);
//{"name":"XIAOMING","age":18,"sex":true,"address":["广东省","广州市"]}
var obj = {name: "xiaoming",age: 18,sex: true,address: ["广东省", "广州市"]
};var jsonStr = JSON.stringify(obj, ["name", "age"]);
console.log(jsonStr);
//{"name":"xiaoming","age":18}

使用3个参数

var obj = {name: "xiaoming",age: 18,sex: true,address: ["广东省", "广州市"]
};function replacerFn(key, value) {if (typeof value === "string") {return value.toUpperCase();}return value;
}
var jsonStr = JSON.stringify(obj, ["name", "age"], 10);
console.log(jsonStr);

在这里插入图片描述

var obj = {name: "xiaoming",age: 18,sex: true,address: ["广东省", "广州市"]
};function replacerFn(key, value) {if (typeof value === "string") {return value.toUpperCase();}return value;
}
var jsonStr = JSON.stringify(obj, ["name", "age"], "@@@");
console.log(jsonStr);

在这里插入图片描述

其他

var jsonStr = JSON.stringify([new Number(1), new String("false"), new Boolean(false)]);
console.log(jsonStr); 
//[1,"false",false]
var jsonStr = JSON.stringify({x: undefined,y: Object,z: Symbol("")
});
console.log(jsonStr);
//{}
var jsonStr = JSON.stringify([undefined, Object, Symbol("")]);
console.log(jsonStr);
//[null,null,null]

自定义toJson

如果一个被序列化的对象拥有toJSON()函数,那么toJSON()函数就会覆盖默认的序列化行为,被序列化的值将不再是原来的属性值,而是toJSON()函数的返回值。

toJSON()函数用于更精确的控制序列化,可以看作是对stringify()函数的补充。

var obj = {name: "xiaoming",age: 18,sex: true,address: ["广东省", "广州市"],toJSON: function() {return {Name: this.name,Age: this.age,Sex: this.sex};}
};var jsonStr = JSON.stringify(obj);
console.log(jsonStr);
//{"Name":"xiaoming","Age":18,"Sex":true}

序列化顺序

序列化处理的顺序如下:

  • 如果待序列化的对象存在toJSON()函数,则优先调用toJSON()函数,以toJSON()函数的返回值作为待序列化的值,否则返回JSON对象本身。
  • 如果stringify()函数提供了第二个参数replacer,则对上一步的返回值经过replacer参数处理。
  • 如果stringify()函数提供了第三个参数,则对JSON字符串进行格式化处理,返回最终的结果。

反序列化

JSON.parse()

语法

JSON.parse(text, reviver)

说明

参数text:待解析度JSON字符串。

参数reviver:可选参数。

  • 如果是一个函数,则规定了原始值在返回之前如何被解析改造。
  • 如果被解析的JSON字符串是非法的,则会抛出异常。

仅一个参数使用

var arrStr = '[1,true,"hello"]';
var arr = JSON.parse(arrStr);
console.log(arr); //[1, true, "hello"]
var objStr = `{
"name":"xiaoming",
"age":18,
"address":"beijing"
}`;
var obj = JSON.parse(objStr);
console.log(obj); //{name: "xiaoming", age: 18, address: "beijing"}
var a = "12.34";
var result = JSON.parse(a);
console.log(result); //12.34

使用2个参数

var objStr = `{
"name":"xiaoming",
"age":18,
"address":"beijing"
}`;
var result = JSON.parse(objStr, function(key, value) {if (key === "name") {return value + "先生";}if (key === "age") {return value + "岁";}return value;
});
console.log(result); //{name: "xiaoming先生", age: "18岁", address: "beijing"}

eval()

eval()函数用于计算JavaScript字符串,并把它作为脚本来执行。

语法

eval("(" + str + ")")

说明

这里为什么要使用括号将拼接出来的字符串括起来呢?

因为JSON字符串是以“{}”表示开始和结束,在JavaScript中它会被当作一个语句块来处理,所以必须强制将它处理成一个表达式,所以采用括号。

使用

var objStr = `{
"name":"xiaoming",
"age":18,
"address":"beijing"
}`;
var result = eval("(" + objStr + ")");
console.log(result); //{name: "xiaoming先生", age: "18岁", address: "beijing"}

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

如若内容造成侵权/违法违规/事实不符,请联系郑州代理记账网进行投诉反馈,一经查实,立即删除!

相关文章

Win10自带输入法词库的导入导出以及其他设置

Win10自带输入法的设置页面比较隐蔽,而且搜不到“微软拼音”这项设置。 设置方法如下: 即可找到输入法的设置。

Fisher确切概率基本原理详解

Fisher确切概率 基本原理 比较两组有效率是否有差异。 在周边合计不变的情况下,计算实际频率变动时的Pi(概率)。然后计算累积概率,依据检验水平做推断。 累积概率的计算 以a从小到大的概率排序 左侧概率:现有样本…

CRM真的能帮提高销售业绩吗?

随着互联网的发展,CRM已经被大家所熟知,但是很多人还是会有疑问,CRM真的能帮我提高销售业绩吗?答案当然是肯定的,但前提是需要合理利用好CRM系统。销售自动化、营销自动化、BI数据分析、全渠道沟通等重要工具模块&…

如何借助销售数据分析工具提升企业的运营能力?

数据分析的重要性 我们做一件事情之前肯定是有一个目的的,那么销售数据分析的目的是什么?我觉得就是通过和数据的对话发现隐患,寻找解决方案,制定相应措施,让企业健康发展。 企业的每个数据都是有生命力的&#xff0…

电子元器件行业B2B交易管理系统:提升数据化驱动能力,促进企业销售业绩增长

“无器件,不产品”,不需要电子元器件的场景已不存在。就像建房要用到一砖一瓦,电子元器件隐身于整机产品中,已渗透至国民经济各角落和社会生活各方面,广泛应用于智能终端、汽车电子、5G通信、物联网以及航空航天、能源…

vue中axios请求回来的数据如何实现局部的自动更新

最近公司让做的一个项目要求是让表格里面的数据实现自动更新。我一开始想的是用定时器,但是使用定时器的话,页面的的其他部分加载不出来了。而且定时器设置的时间间隔短的话会造成栈溢出。 后来变化了一个思路,如下: 首先在全局…

使用postman卡顿,切换窗口之后在切换回来卡顿现象

原文 1 操作 修改C:\Users\{user-name}\AppData\Roaming\Postman\storage这个文件夹的名字或者直接删除,然后重启postman即可。 2 参考 https://learnku.com/articles/53569 https://github.com/postmanlabs/postman-app-support/issues/4687#issuecomment-727…

Vmware虚拟机安装黑群辉提示系统可恢复,无限还原,解决办法。

近期有粉丝反馈,想重装一下群辉系统,但是系统安装完毕后,开机提示系统可恢复,无法启动,并无限还原,也无法进入系统,但是之前安装是没问题的,然后我自己试了一下,安装也有…