介绍

什么是序列化,序列化就是将对象数据转换为可以存储或者传输的过程。在js中,经常使用JSON来进行数据的序列化和反序列化,需要注意的是JavaScript不是JSON,JSON也不是JavaScript。

虽然JSON是基于JavaScript语法,但是JSON并不是Javascript的子集。JSON序列化是将对象或值转换为JSON字符串,并提供对应的解析JSON字符串的方法。

语法

JSON.stringify(value[, replacer [, space]])可将一个js对象或值转换为JSON字符串,其一共有三个参数,如果指定了replacer且为函数,则被序列化的每一个值都会经过此函数的处理;如果replacer为数组,则只有在数组中的属性才会被序列化。

value:将要被序列化的值,可为js对象或普通值

replacer:可选参数

  • 如果该参数指定为一个函数,则在序列化的过程中,被序列化的值的每一个属性都将经过函数的转换和处理,最终的JSON字符串将与函数有关
  • 如果该参数指定为一个数组,则在序列化的过程中,只有包含在数组中的属性名才会被序列化,最终的JSON字符串与原数据相比是做了“过滤”
  • 如果该参数未指定、指定为null或指定为其他值,则在序列化的过程中,所有的属性都将被序列化

space:可选参数

  • 指定用于缩进的空白字符串个数
  • 如果参数的值为数字,则表示有多少个空格;最大值为10,若小于1,则表示没有空格
  • 如果参数的值为字符串,则该字符串被视为空格,用于美化输出;如果字符串长度超过10,则截取前10
  • 如果没有提供,或提供为null,则表示没有空格

异常情况

  • 尝试转换循环引用时,会抛出异常
  • 尝试转换BigInt类型时,也会抛出异常
  • 如果不确定被转换数据的类型,可将JSON.stringify()放入try/catch中执行

案例

value

将对象或值转换为JSON字符串

  • 如果被转换对象中含有toJSON() 方法,则最终的JSON字符串有toJSON()决定,因此需要注意不能在方法中轻易覆盖此方法。
  • 非数组对象在被序列化后,不保证其属性还是按照特定的顺序出现在JSON字符串
  • 布尔值、数字、字符串的包装类型,即通过new Boolean()new Number()new String()创建的数据,在转换时会自动转换成对应的基本数据类型
  • 函数、undefined单独被转换时,会返回undefined;函数、undefined、symbol在序列化过程中,如果出现在数组中则转换为null,如果为非数组的属性则会被忽略
  • 无法转换存在循环引用的对象
  • NaN、Infinity、null都会被转换为null
  • 所有以symbol为键的属性都会被忽略掉,即使在replacer函数中强制指定了需要包含这些属性
  • 其他类型的对象,则仅会序列化可枚举属性
// 基础值和对象
JSON.stringify({}) // '{}'
JSON.stringify('str') // '"str"'
JSON.stringify("str") // '"str"'
JSON.stringify(true) // 'true'
​
JSON.stringify([new Number(2), new String('true'), new Boolean(true)]) // 包装类型,转换为对应的基本类型。'[1, "true", true]'
JSON.stringify(undefined) // 单独转换,undefined
JSON.stringify(function () {}) // 单独转换,undefined
JSON.stringify([undefined, function () {}, Object, Symbol(1)]) // 如果出现在数组中,则转换为null,'[null, null,null, null]'
JSON.stringify({x:undefined, y:function () {}, Object, z:Symbol(1)}) // 如果出现在非数组对象中,则会被忽略,'{}'
​
// 以Symbol为键的属性都会被忽略
JSON.stringify({[Symbol('key')]: 'value'}) // '{}', 忽略Symbol
JSON.stringify({[Symbol('key')]: 'value'}, [Symbol('key')]) // '{}', 就算数组中包含也会忽略
JSON.stringify({[Symbol('key')]: 'value'}, function (k, v) {
    if (k === 'symbol') {
        return 'symbol'
    }
}) // undefined, 就算是在replacer中强制指定,也会被忽略
​
JSON.stringify(NaN) // null
JSON.stringify(null) // null
JSON.stringify(Infinity) // null

replacer

replacer可以是一个函数,也可是一个数组。如果是函数,则有两个参数,分别为key和value,两者都可以被序列化;如果是数组,则仅在数组中的属性会被序列化。

function replacer (key, value) {
    if (typeof value === 'boolean') {
        return undefined;
    } else if (typeof value === 'string') {
        return {
            flag: true
        }
    } else if (typeof value === 'number') {
        return function () {
            console.log('value', value)
        }
    } else if (Array.isArray(value)) {
        return {
            isArr: true
        };
    }
    return value
}
let obj = {
    bool: false,
    str: 'hello',
    num: 10,
    arr: [20]
}
let jsonStr = JSON.stringify(obj, replacer); // '"str": {}, "arr": {}'
// 如果返回为undefined,则该属性不会显示在JSON字符串中
// 如果返回为对象,则该对象递归调用replacer序列化成JSON字符串
// 如果返回为函数,则该函数不会被序列化成JSON字符串
// 由于存在递归调用,因此需要避免超出最大调用栈
​
jsonStr = JSON.stringify(obj, ['bool', 'num']) // '{"bool": false, "num": 10}', 如果是数组,则仅会序列化数组中的属性

space

用来控制序列化后的JSON字符串里面空格的间距。如果是数字,则表示缩进多少个空格;如果是字符串,则用该字符串代替空格。space的最大长度为10

JSON.stringify({
    x: 10,
    y: 20
}, null, 4); // '{\n    "x": 10,\n    "y": 20\n}'
JSON.stringify({
    x: 10,
    y: 20
}, null, 'hello'); // '{\nhello"x": 10,\nhello"y": 20\n}'

toJSON

如果一个被序列化的对象拥有toJSON方法,则该方法就会覆盖默认的序列化行为,即不是该对象被序列化,而是调用toJSON方法后返回的值被序列化。

let obj = {
    x: 10,
    y: 30,
    toJSON: function() {
        return {z: 40};
    }
};
JSON.stringify(obj); // '30',序列化的是toJSON返回的值,而不是整个对象
JSON.stringify({x: obj}, function(k, v) {
    if (v.z == 40) {
        return {z: 50}
    }
    return v;
}); // '{"x":{"z":50}}',使用replacer函数处理的也是处理的是toJSON返回的值,而不是整个对象

总结

  • JSON可使用stringify方法实现对象或值的序列化
  • replacer参数可以是函数,也可以是数组。函数用来处理被序列化的值的每一个属性,数组表示只序列化哪些属性,两者可以在某些场景下实现相同的效果
  • 被序列化的对象如果有toJSON方法,则序列化的是该方法返回的值
  • JSON.stringify可与localStorage结合使用,用于存储登录信息等;也可用于简单的深拷贝
  • 合理使用第二个参数replacer,可更好的处理序列化对象时可能被忽略、转换的属性值
  • 在序列化时可能会抛出异常,可将其放入try/catch中执行

以上就是JavaScript语法 JSON序列化之stringify实例详解的详细内容,更多关于JavaScript JSON 序列化 stringify的资料请关注Devmax其它相关文章!

JavaScript语法 JSON序列化之stringify实例详解的更多相关文章

  1. 基于JavaScript编写一个图片转PDF转换器

    本文为大家介绍了一个简单的 JavaScript 项目,可以将图片转换为 PDF 文件。你可以从本地选择任何一张图片,只需点击一下即可将其转换为 PDF 文件,感兴趣的可以动手尝试一下

  2. HTML5数字输入仅接受整数的实现代码

    这篇文章主要介绍了HTML5数字输入仅接受整数的实现代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  3. amaze ui 的使用详细教程

    这篇文章主要介绍了amaze ui 的使用详细教程,本文通过多种方法给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  4. html5简介_动力节点Java学院整理

    这篇文章主要介绍了html5简介,用于指定构建网页的元素,这些元素中的大多数都用于描述网页内容,有兴趣的可以了解一下

  5. ios 8 Homescreen webapp,关闭和打开iPad停止javascript

    我有一个适用于iPad的全屏HTML5网络应用程序,并且刚刚安装了IOS8来试用它,它一切正常,直到你关闭并重新启动iPad.一旦web应用程序重新启动javascript就会停止并加载新页面不会重新启动它.在iPad上的Safari中打开同一页面时,关闭和打开iPad会继续按预期工作.其他人注意到了这个或想出了一个解决方案吗?解决方法这似乎是我在iOS8.1.1更新中解决的.

  6. iOS 6 javascript与object.defineProperty的间歇性问题

    当访问使用较新的Object.defineProperty语法定义属性的对象的属性时,有没有其他人注意到新iOS6javascript引擎中的间歇性错误/问题?https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/defineProperty我正在看到javascript失败的情况,说

  7. ios – 如何使用JSExport导出内部类的方法

    解决方法似乎没有办法将内部类函数导出到javascript.我将内部类移出并创建了独立的类,它起作用了.

  8. 静音iOS推送通知与React Native应用程序在后台

    我有一个ReactNative应用程序,我试图获得一个发送到JavaScript处理程序的静默iOS推送通知.我看到的行为是AppDelegate中的didReceiveRemoteNotification函数被调用,但是我的JavaScript中的处理程序不会被调用,除非应用程序在前台,或者最近才被关闭.我很困惑的事情显然是应用程序正在被唤醒,并且它的didReceiveRemoteNotifi

  9. ios – 内存泄漏与UIWebView和Javascript

    清楚地包含一个Javascript文件到我的HTML是使UIWebView泄漏内存.当我重复使用相同的UIWebView对象时,或者每当我有内容实例化一个新的漏洞时,会出现泄漏的事实,导致我认为必须有一些JavaScript文件被loadHTMLString处理,导致泄漏.有人知道如何解决这个问题吗?

  10. iOS应用程序的UI自动化测试如何与乐器和Javascript

    从WWDC2010视频会议中了解iOS应用程序的自动化UI测试,但没有实践.从代码项目project,我们可以有一个例子.这个问题在这里听到有涉及这个的人.任何限制?解决方法我建议从AlexWollmer开始使用thisblogpost.他创建了一个非常有用的JavaScript库:tuneup_jswithtest()函数,它允许测试分离和有用的帮助者以及为自动化仪器编写测试的断言.

随机推荐

  1. js中‘!.’是什么意思

  2. Vue如何指定不编译的文件夹和favicon.ico

    这篇文章主要介绍了Vue如何指定不编译的文件夹和favicon.ico,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  3. 基于JavaScript编写一个图片转PDF转换器

    本文为大家介绍了一个简单的 JavaScript 项目,可以将图片转换为 PDF 文件。你可以从本地选择任何一张图片,只需点击一下即可将其转换为 PDF 文件,感兴趣的可以动手尝试一下

  4. jquery点赞功能实现代码 点个赞吧!

    点赞功能很多地方都会出现,如何实现爱心点赞功能,这篇文章主要为大家详细介绍了jquery点赞功能实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  5. AngularJs上传前预览图片的实例代码

    使用AngularJs进行开发,在项目中,经常会遇到上传图片后,需在一旁预览图片内容,怎么实现这样的功能呢?今天小编给大家分享AugularJs上传前预览图片的实现代码,需要的朋友参考下吧

  6. JavaScript面向对象编程入门教程

    这篇文章主要介绍了JavaScript面向对象编程的相关概念,例如类、对象、属性、方法等面向对象的术语,并以实例讲解各种术语的使用,非常好的一篇面向对象入门教程,其它语言也可以参考哦

  7. jQuery中的通配符选择器使用总结

    通配符在控制input标签时相当好用,这里简单进行了jQuery中的通配符选择器使用总结,需要的朋友可以参考下

  8. javascript 动态调整图片尺寸实现代码

    在自己的网站上更新文章时一个比较常见的问题是:文章插图太宽,使整个网页都变形了。如果对每个插图都先进行缩放再插入的话,太麻烦了。

  9. jquery ajaxfileupload异步上传插件

    这篇文章主要为大家详细介绍了jquery ajaxfileupload异步上传插件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. React学习之受控组件与数据共享实例分析

    这篇文章主要介绍了React学习之受控组件与数据共享,结合实例形式分析了React受控组件与组件间数据共享相关原理与使用技巧,需要的朋友可以参考下

返回
顶部