当前位置: 澳门新濠3559 > 服务器运维 > 正文

对象序列化是指将对象的状态转换为字符串(来

时间:2019-12-08 19:30来源:服务器运维
一.什么是对象序列化? 本文实例讲述了JSON与js对象序列化。分享给大家供大家参考,具体如下: 浅谈JSON中stringify 函数、toJosn函数和parse函数,jsonstringify JSON.stringify 函数 (JavaScript) 语

一.什么是对象序列化?

本文实例讲述了JSON与js对象序列化。分享给大家供大家参考,具体如下:

浅谈JSON中stringify 函数、toJosn函数和parse函数,jsonstringify

JSON.stringify 函数 (JavaScript)

语法:JSON.stringify(value [, replacer] [, space])

将 JavaScript 值转换为 JavaScript 对象表示法 (Json) 字符串。

复制代码 代码如下:

value
必需。 要转换的 JavaScript 值(通常为对象或数组)。
replacer
可选。 用于转换结果的函数或数组。
如果 replacer 为函数,则 JSON.stringify 将调用该函数,并传入每个成员的键和值。 使用返回值而不是原始值。 如果此函数返回 undefined,则排除成员。 根对象的键是一个空字符串:""。
如果 replacer 是一个数组,则仅转换该数组中具有键值的成员。 成员的转换顺序与键在数组中的顺序一样。 当 value 参数也为数组时,将忽略 replacer 数组。
space
可选。 向返回值 JSON 文本添加缩进、空格和换行符以使其更易于读取。
如果省略 space,则将生成返回值文本,而没有任何额外空格。
如果 space 是一个数字,则返回值文本在每个级别缩进指定数目的空格。 如果 space 大于 10,则文本缩进 10 个空格。
如果 space 是一个非空字符串(例如“t”),则返回值文本在每个级别中缩进字符串中的字符。
如果 space 是长度大于 10 个字符的字符串,则使用前 10 个字符。

如果 value 具有 toJSON 方法,则 JSON.stringify 函数将使用该方法的返回值。 如果 toJSON 方法的返回值为 undefined,则不转换成员。 这使对象能够确定自己的 JSON 表示形式。

将不会转换不具有 JSON 表示形式的值,例如 undefined。 在对象中,将丢弃这些值。 在数组中,会将这些值替换为 null。

执行顺序

在序列化过程中,如果 value 参数对应有 toJSON 方法,则 JSON.stringify 将首先调用 toJSON 方法。 如果该方法不存在,则使用原始值。 接下来,如果提供 replacer 参数,则该值(原始值或 toJSON 返回值)将替换为 replacer 参数的返回值。 最后,根据可选 space 参数向该值添加空格以生成最终的 JSON 文本。

此示例使用 JSON.stringify 将 contact 对象转换为 JSON 文本。 定义 memberfilter 数组以便只转换surname 和 phone 成员。 省略 firstname 成员。

复制代码 代码如下:

var contact = new Object();
contact.firstname = "Jesper";
contact.surname = "Aaberg";
contact.phone = ["555-0100", "555-0120"];
var memberfilter = new Array();
memberfilter[0] = "surname";
memberfilter[1] = "phone";
var jsonText = JSON.stringify(contact, memberfilter, "t");
document.write(jsonText);
// Output:
// { "surname": "Aaberg", "phone": [ "555-0100", "555-0120" ] }

toJSON 方法 (Date) (JavaScript)

语法:objectname.toJSON()

objectname

必需。 需要进行 JSON 序列化的对象。

toJSON 方法是 Date JavaScript 对象的内置成员。 它返回 UTC 时区的 ISO 格式日期字符串(由后缀 Z 表示)。

以下示例使用 toJSON 方法将大写的字符串成员值序列化。 在调用 JSON.stringify 时调用 toJSON 方法。

复制代码 代码如下:

JavaScript
var contact = new Object();
contact.firstname = "Jesper";
contact.surname = "Aaberg";
contact.phone = ["555-0100", "555-0120"];
contact.toJSON = function(key)
 {
    var replacement = new Object();
    for (var val in this)
    {
        if (typeof (this[val]) === 'string')
            replacement[val] = this[val].toUpperCase();
        else
            replacement[val] = this[val]
    }
    return replacement;
};
var jsonText = JSON.stringify(contact);
/* The value of jsonText is:
'{"firstname":"JESPER","surname":"AABERG","phone":["555-0100","555-0120"]}'
*/

JSON.parse 函数 (JavaScript)

将 JavaScript 对象表示法 (JSON) 字符串转换为对象

语法:JSON.parse(text [, reviver])

澳门新濠3559,复制代码 代码如下:

text
必需。 一个有效的 JSON 字符串。
reviver
可选。 一个转换结果的函数。 将为对象的每个成员调用此函数。 如果成员包含嵌套对象,则先于父对象转换嵌套对象。 对于每个成员,会发生以下情况:
如果 reviver 返回一个有效值,则成员值将替换为转换后的值。
如果 reviver 返回它接收的相同值,则不修改成员值。
如果 reviver 返回 null 或 undefined,则删除成员。

以下示例使用 JSON.parse 将 JSON 字符串转换成对象。

复制代码 代码如下:

var jsontext = '{"firstname":"Jesper","surname":"Aaberg","phone":["555-0100","555-0120"]}';
var contact = JSON.parse(jsontext);
document.write(contact.surname + ", " + contact.firstname);
// Output: Aaberg, Jesper

以下示例演示了如何使用 JSON.stringify 将数组转换成 JSON 字符串,然后使用 JSON.parse 将该字符串重新转换成数组。

复制代码 代码如下:

var arr = ["a", "b", "c"];
var str = JSON.stringify(arr);
document.write(str);
document.write ("<br/>");
var newArr = JSON.parse(str);
while (newArr.length > 0) {
    document.write(newArr.pop() + "<br/>");
}
// Output:
// ["a","b","c"]
// c
// b
// a

函数、toJosn函数和parse函数,jsonstringify JSON.stringify 函数 (JavaScript) 语法:JSON.stringify(value [, replacer] [, space]) 将 JavaScript 值...

对象序列化是指将对象的状态转换为字符串(来自我这菜鸟的理解,好像有些书上也是这么说的,浅显易懂!);

JavaScript对象表示法(JavaScript Object Notation,简称JSON)是一种轻量级的数据交换格式,它基于js字面量表示法,是js的一个子集。虽然是一个js的子集但是他与语言无关,它可以用于在现在所有的编程语言编写的应用程序之间进行数据交换。是一种文本格式,比较容易读写。

序列化是将对象的状态信息转换为可以存储或传输的形式的过程(来自“百度百科—序列化“,学术性强,略显高端);

JSON是一个容纳“名/值”对的无序集合,名字可以是任意字符串,值可以使任意的JSON类型的值。大多数编程语言都有被映射为JSON的数据类型,比 如对象,字典,哈希表,关联数组等。

二.为什么会有对象序列化?

JSON有六种类型的值:对象,数组,字符串,数字,布尔值和特殊值null。

世间万物,都有其存在的原因。为什么会有对象序列化呢?因为程序猿们需要它。既然是对象序列化,那我们就先从一个对象说起:

console.log; // 5console.log; // 5console.log; // trueconsole.log; // trueconsole.log); // "hello"console.log; // 报错 因为hello不是JSON字符串console.log; // nullconsole.log; // nullconsole.log); // 报错 因为JSON不能表示undefined换用null代替
var obj = {x:1, y:2};

JSON的结构

当这句代码运行时,对象obj的内容会存储在一块内存中,而obj本身存储的只是这块内存的地址的映射而已。简单的说,对象obj就是我们的程序在电脑通电时在内存中维护的一种东西,如果我们程序停止了或者电脑断电了,对象obj将不复存在。那么如何把对象obj的内容保存在磁盘上呢?这时就需要把对象obj序列化,也就是说把obj的内容转换成一个字符串的形式,然后再保存在磁盘上。另外,我们又怎么通过HTTP协议把对象obj的内容发送到客户端呢?没错,还是需要先把对象obj序列化,然后客户端根据接收到的字符串再反序列化解析出相应的对象。这也正是”百度百科—序列化“中描述的两个作用——存储、传输。

JSON具有两种结构:对象,数组

三.JavaScript中的对象序列化

对象结构以”{”大括号开始,以”}”大括号结束。中间部分由0或多个以”,”分隔的”key”对构成,关键字字符串和值之间以”:”分隔,语法结构如代码。

JSON的全称是”JavaScript Object Notation“——JavaScript对象表示法。ECMAScript 5中提供了内置函数JSON.stringify用来序列化和还原JavaScript对象。它们使用起来也很简单:

{ key1:value1, key2:value2, ...}

{ "name": "hum", "age": 26, "sex": 1, "love": [ "swing", "jump" ], "birthday": "1988-01-12"}

可以看到,exampleStr和exampleObj2中并没有 y:undefined 的内容。这说明:JSON的语法是JavaScript语法的子集,它并不能表示JavaScript中的所有值,对于JSON语法不支持的属性,序列化后会将其省略。其详细规则如下:

NOTE:

①对于JavaScript中的五种原始类型,JSON语法支持数字、字符串、布尔值、null四种,不支持undefined; ②NaN、Infinity和-Infinity序列化的结果是null; ③JSON语法不支持函数; ④除了RegExp、Error对象,JSON语法支持其他所有对象; ⑤日期对象序列化的结果是ISO格式的字符串,但JSON.parse()依然保留它们字符串形态,并不会将其还原为日期对象; ⑥JSON.stringify()只能序列化对象的可枚举的自有属性;

在js中表示JSON字符串时最好在外面加上单引号。

从上面的例子也可以看到,在符合以上规则的情况下,还可以通过对象序列化和反序列化完成对象的深拷贝。

如下:复制代码 代码如下:console.log(JSON.parse('{"num":5,"stop":true,"str":"hello","empty":null}'));// object{num:5,stop:true,str:"hello",empty: null}

以上就是JSON.stringify的常用用法了,但这两个方法并不止这么简单:

与js对象字面量相比,JSON对象没有变量声明也没有末尾的分号。数组结构以”[”开始,”]”结束。中间由0或多个以”,”分隔的值列表组成,语法结构如代码。

四.完整版JSON.stringify()

[ { key1:value1, key2:value2, ... }]

[ { "Id": 7, "Mentions": [ { "Id": 5, "StatusId": 34, "CreatedDateTime":"/Date/", "Text":"Text", "UserName":"Username", "UserLocation":"UK", "UserLanguage":"en-GB", "IsCheckIn":"true" } ], "Checkins": 0, "HereNow": 0, "TimeStamp":"/Date/", "Venue": { "Id": 7, "FoursquareId":"cacbf3bd-f0aa-403d-9f9b-2056b4985ba1", "Name":"Venue Name" } }, { "name":"hahahhahah", "port":[ { "port": 8080, "protocol":"HTTP", "IP":"123.12.06.456" } ] }]

1.简介

JSON数组采用的是javascript数组字面量的形式。

序列化原始值、对象或数组

JSON的解析与序列化

2.概要

js的JSON的解析与序列化与AS3是相同的。我们常用的也就是JSON对象(ECMAScript 5中添加的, 早期JSON解析基本都使用javascript的eval()函数。但是eval有一些性能和安全上的缺点,ECMAScript对解析JSON对象进 行了规范,定义了全局对象JSON,支持的浏览器有标准浏览器和IE8+。对于不支持的浏览器可以引入json2.js文件。)的stringify与parse这两个方法。

JSON.stringify(o[, filter][, indent])

接下来我们来一一说明。

3.参数

JSON.stringify

o,要转换成JSON字符串的原始值、对象或数组

JSON.stringify()将javascript对象序列化为JSON格式的字符串JSON.stringify包含三个参数,通常我们在使用的时候只带第一个参数,来返回字符串。

filter,可选参数,一个数组或函数

ob:要转化成JSON字符串的对象,数组,原始值。filter:是一个可选的参数,通常是一个函数,用来在字符串化前对值做一些替换。也可以是一个数组,包含哪些需要字符串化的属性名。就是用来过滤的。indent:也是一个可选参数,在需要输出格式化的可阅读的代码时,使用indent参数来指定用来缩进的字符串或空格。如果省略该参数,返回的字符串将不带任何的额外的空格,这样输出的值很难阅读。就是用来格式化的。

indent,可选参数,一个数值或一个字符串

下面是几个对应的例子:

4.返回

首先是第二个参数是数组过滤器的时候:

JSON格式的字符串,代表o的值,同时通过了filter的过滤,以及根据indent进行了格式化

var oJson = { name: 'hum', age: 20, sex: 1};console.log(JSON.stringify(oJson, ['age', 'sex'])); // {"age":20,"sex":1}

5.描述

如果第二个参数是字符串的时候,该数组会作为对象的属性名,属性名不在这个数组中的任何对象的属性在序列化的时候都会被忽略掉。此外,返回的字符串中的属性的顺序,会与该数组中的属性名一致。

①当对象o自身带有toJSON会调用o的toJSON()方法,并使用该方法的返回值而不是该对象本身进行字符串化;

var oJson = { name: 'hum', age: 26, sex: 1, love: ['swing', 'jump']}; console.log(JSON.stringify{ switch { case 'age': return v > 20 ? '成年': '未成年'; case 'love': return v.join; case 'sex': return undefined; default : return v; } })); // {"name":"hum","age":"成年","love":"swing,jump"}

②如果filter存在且是一个函数,那么该函数的返回值将会作为JSON.stringify()方法的返回值。并且该函数接收两个参数,第一个参数是一个空字符串,第二个参数就是对象o。

如果该参数是函数,则它是一个替换函数,该函数会在每一个需要字符串化的对象上调用。这个函数的第一个参数是该对象中的属性名或数组的序号,第二个则是值本身。函数的返回值会替换掉需要字符串化的值,如果函数返回undefined或没有任何的返回值,则会在字符串化的时候忽略这个值。

③如果filter存在且是一个字符串数组(如果数组中包含数字,数字会自动转化为字符串),那么对象o的某些属性名如果不在这个数组中,则序列化时会将这些属性省略,且返回的字符串中属性的顺序会与该数组中属性的顺序一致;

stringify的第三个参数的实例:

④JSON.stringify()返回的通常是不带任何空格或换行符的字符串。如果想输出可读性更好的字符串,需要指定第三个参数。如果指定的第三个参数是介于1~10之间的值,则JSON.stringify()会在每一“层级”的输出插入换行符和指定个数的空格。如果指定的第三个参数是非空字符串,则JSON.stringify来缩进层级;

var oJson = { name: 'hum', age: 26, sex: 1, love: ['swing', 'jump']}; console.log(JSON.stringify; /* { "name": "hum", "age": 26, "sex": 1, "love": [ "swing", "jump" ] } */

五.完整版JSON.parse()

通常这个方法的返回值是一个不带任何空格或换行符的给机器阅读的字符串,如果想输出更易于阅读的代码,就需要设置第三个参数了。

1.简介

var oJson = { name: 'hum', age: 26, sex: 1, love: ['swing', 'jump']}; console.log(JSON.stringify; /* { --"name": "hum", --"age": 26, --"sex": 1, --"love": [ ----"swing", ----"jump" --] } */

解析JSON格式的字符串

这样就很容易理解了。。。

2.概要

JSON.parse

JSON.parse

JSON.parse用来解析json格式的字符串

3.参数

JSON.parse包含两个方法.

reviver,可选参数,用来转换解析值的可选函数

s:要解析的字符串reviver:用来转换解析值得可选函数

4.返回

我们通常使用只使用第一个参数,可选参数reviver,主要是在返回解析值之前,对其进行过滤或后期处理。reviver函数会在从s中解析的每个原始值调用一次。调用reviver函数是带有两个参数,第一个属性名,第二个参数是对象的属性或是数组的元素值。reviver函数会作为包含原始值的对象/数组的方法来调用。reviver函数的返回值会成为属性的新值,如果reviver返回第二个参数,则属性不变。如果reviver返回undefined或不凡会任何值,则会从对象或是数组中删除属性。下面是一个实例:

一个对象、数组或原始值。该返回值是从s中解析的;

var oJson = { name: 'hum', age: 26, sex: 1, love: ['swing', 'jump'], birthday: '1988-01-12'}; var sJson = JSON.stringify; console.log;//{"name":"hum","age":26,"sex":1,"love":["swing","jump"],"birthday":"1988-01-12"} console.log; console.log(JSON.parse(sJson, function  { if{ // 返回日期对象 return new Date; }else if{ // sex不在了 return undefined; }else{ return v; } }));

5.描述

PS:关于json操作,这里再为大家推荐几款比较实用的json在线工具供大家参考使用:

①如果指定了reviver函数,该函数会为从s中解析的每一个原始值调用一次。调用reviver时带有两个参数,第一个参数是属性名——对象的属性名或转换成字符串的数组序号,第二个参数是对象属性或数组元素的原始值。并且,reviver函数的返回值将作为JSON.parse()的返回值;

在线JSON代码检验、检验、美化、格式化工具:

以上就是关于JavaScript对象序列化的相关内容,希望对大家的学习有所帮助。

JSON在线格式化工具:

在线XML/JSON互相转换工具:

json代码在线格式化/美化/压缩/编辑/转换工具:

在线json压缩/转义工具:

C语言风格/HTML/CSS/json代码格式化美化工具:

更多关于JavaScript相关内容可查看本站专题:《JavaScript中json操作技巧总结》、《JavaScript查找算法技巧总结》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》

希望本文所述对大家JavaScript程序设计有所帮助。

编辑:服务器运维 本文来源:对象序列化是指将对象的状态转换为字符串(来

关键词: