时间:2021-05-26
上一节我们讲解了JSON.stringify()的基本用法,这一节我们来重点探讨一下序列化。
JSON.stringify()除了要序列化的js对象外,还可以接收另外两个参数,这两个参数用于指定不同方式序列化js对象。第一个参数是过滤器,可以使一个数组,也可以是一个函数;第二个参数是一个选项,表示是否在JSON字符串中保留缩进。单独或组合使用这两个参数,可以更全面深入地控制JSON的序列化。
1、过滤结果
如果过滤器参数是数组,那么JSON.stringify()的结果中将只包含数组中列出的属性。如:
复制代码 代码如下:
<html>
<head>
<title></title>
<script type="text/javascript">
function init()
{
var student={
name:"Bill",
age:12,
grade:3,
id:"0802020114"
};
var jsonText=JSON.stringify(student,["name","id"]);
}
</script>
</head>
<body>
<input type="button" onclick="init()" value="测试" />
</body>
</html>
jsonText的值为
{"name":"Bill","id":"802020114"}
如果第二个参数是函数,行为会有一点不同。传入的函数接收两个参数,属性(键)名和属性值。根据属性(键)名可以知道应该如何处理要序列化的对象中的属性。属性名只能是字符串。
为了改变序列化对象的结果,函数返回的值就是相应键的值。不过要注意,如果函数返回了undefined,那么相应的属性会被忽略。如:
复制代码 代码如下:
<html>
<head>
<title></title>
<script type="text/javascript">
function init()
{
var student={
name:"Bill",
age:12,
grade:3,
id:"0802020114",
subject:["math","Chinese","English"]
};
var jsonText=JSON.stringify(student,jsonConvert);
}
function jsonConvert(key,value)
{
switch (key)
{
case "name":
return "Lily";
case "grade":
return undefined;
case "subject":
return value.join(",");
default :
return value;
}
}
</script>
</head>
<body>
<input type="button" onclick="init()" value="测试" />
</body>
</html>
这里函数过滤器根据传入的键来决定结果。如果键为name,就将其值设置为Lily;如果为grade就返回undefined来删除该属性;如果为subject,它是一个数组,就将它通过数组方法join()转化为以逗号连接的字符串。最后一定要提供default项,使其他的值都能够正常出现在结果中,不然就会出错,没有结果。实际上,第一次调用这个函数过滤器,传入的键是一个空字符串,而值就是student对象。上面的jsonText的值如下:
{"name":"Lily","age":12,"id":"0802020114","subject":"math,Chinese,English"}
在内部是按顺序遍历每一个对象每一个属性,所以公开key,value函数方法需要注意你的函数只有着两个参数才能起效,要理解函数的目的,就是在内部机制遍历每一个属性的时候让你来修改部分结果,并且是一次遍历每一个对象,这样在序列化对象中每一个对象都要经过过滤器。
2、字符串缩进
JSON.stringify()方法的第三个参数用于控制结果中的缩进和空白符。如果这个参数是一个数值,那么它表示的是每个级别缩进的空格数。如:
复制代码 代码如下:
<html>
<head>
<title></title>
<script type="text/javascript">
function init()
{
var student={
name:"Bill",
age:12,
grade:3,
id:"0802020114",
subject:["math","Chinese","English"]
};
var jsonText=JSON.stringify(student,null,8);
}
</script>
</head>
<body>
<input type="button" onclick="init()" value="测试" />
</body>
</html>
保存在jsonText中的字符串为:
复制代码 代码如下:
{
"name": "Bill",
"age": 12,
"grade": 3,
"id": "0802020114",
"subject": [
"math",
"Chinese",
"English"
]
}
JSON.stringify()在结果字符串中插入了换行符以提高可读性。只要传入有效的控制缩进的参数值,结果字符串就会包含换行符(只缩进而不换行意义不大)。最大缩进空格数位10,所有大于10的值都会自定转换为10。
如果缩进参数是一个字符串而非数值,则这个字符串将在JSON字符串中被用作缩进字符(不再使用空格)。如可以实现如下的效果:
复制代码 代码如下:
{
*"name": "Bill",
*"age": 12,
*"grade": 3,
*"id": "0802020114",
*"subject": [
**"math",
**"Chinese",
**"English"
*]
}
同样字符串最长不能超过10个字符长。如果超过,结果中将只出现10个字符。
3、toJSON()方法
有时候JSON.stringify()还是不能满足对某些对象进行自定义序列化的需求。在这些情况下,可以通过对象上调用toJSON()方法,返回其自身的JSON数据格式。如:
复制代码 代码如下:
<html>
<head>
<title></title>
<script type="text/javascript">
function init()
{
var student={
name:"Bill",
age:12,
grade:3,
id:"0802020114",
subject:["math","Chinese","English"],
toJSON:function(){
return this.name+"_"+this.id;
}
};
var jsonText=JSON.stringify(student);
}
</script>
</head>
<body>
<input type="button" onclick="init()" value="测试" />
</body>
</html>
以上代码在student对象上定义了一个toJSON()方法,该方法返回name和id的组合。最后jsonText的值如下:
"Bill_0802020114"
toJSON()可以作为函数过滤器的补充,因此理解序列化的内部顺序十分重要。假设把一个对象传入JSON.stringify(),序列化该对象的顺序是:
(1)如果存在toJSON()方法而且能够通过它取得有效值,则调用该方法。否则,按默认顺序执行序列化。
(2)如果提供了第二个参数,应用这个函数过滤器。传入函数过滤器的值是第(1)步返回的值。
(3)对第(2)步返回的每个值进行相应的序列化。
(4)如果提供了第三个参数,执行相应的格式化。
无论是考虑滴定toJSON()方法,还是考虑使用函数过滤器,或者需要同时使用两者,理解这个顺序都是至关重要的。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
本文实例讲述了PHP中SERIALIZE和JSON的序列化与反序列化操作区别。分享给大家供大家参考,具体如下:PHP中SERIALIZE和JSON序列化与反序列
提到序列化与反序列化,通常会想到json,xml.在J2EE的开发中,这是很常用的技术,比如一个javaclass与xml之间的序列化与反序列化,我们可以通过x
Java对象序列化NIONIO2详细介绍及解析概要:对象序列化对象序列化机制允许把内存中的Java对象转换成与平台无关的二进制流,从而可以保存到磁盘或者进行网络
Gson反序列化原理原理简述gson反序列化主要分为两个过程:根据TypeToken创建出对象根据json字符串解析数据,对对象属性赋值对象的创建Constru
详解Python序列化Serialize和反序列化Deserialize序列化(serialization)序列化是将对象状态转换为可保持或传输的格式的过程。与