返回顶部
首页 > 资讯 > 前端开发 > JavaScript >JavaScript语法JSON序列化之stringify实例详解
  • 606
分享到

JavaScript语法JSON序列化之stringify实例详解

JavaScriptJSON序列化stringifyJavaScriptJSONstringify 2022-11-13 18:11:31 606人浏览 八月长安
摘要

目录介绍语法案例valuereplacerspacetoJSON总结介绍 什么是序列化,序列化就是将对象数据转换为可以存储或者传输的过程。在js中,经常使用JSON来进行数据的序列化

介绍

什么是序列化,序列化就是将对象数据转换为可以存储或者传输的过程。在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的资料请关注编程网其它相关文章!

--结束END--

本文标题: JavaScript语法JSON序列化之stringify实例详解

本文链接: https://lsjlt.com/news/170185.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • JavaScript语法JSON序列化之stringify实例详解
    目录介绍语法案例valuereplacerspacetoJSON总结介绍 什么是序列化,序列化就是将对象数据转换为可以存储或者传输的过程。在js中,经常使用JSON来进行数据的序列化...
    99+
    2022-11-13
    JavaScript JSON 序列化 stringify JavaScript JSON stringify
  • Go语言基础Json序列化反序列化及文件读写示例详解
    目录概述JSON序列化结构体转JSONmap转JSON切片转JSONJSON反序列化JSON转mapJSON转结构体JSON转切片写JSON文件map写入JSON文件切片写入JSON...
    99+
    2024-04-02
  • 详解Python之数据序列化(json、pickle、shelve)
    一、前言 1. 现实需求 每种编程语言都有各自的数据类型,其中面向对象的编程语言还允许开发者自定义数据类型(如:自定义类),Python也是一样。很多时候我们会有这样的需求: 把内存中的各种数据类型的...
    99+
    2022-06-04
    详解 序列化 数据
  • Python序列化模块之pickle与json详解
    目录序列化模块序列化和反序列化使用场景dumps & loadsdump & loadJSON序列化模块使用场景支持的数据类型JSON和pickle的区别序列化函数j...
    99+
    2024-04-02
  • Python 对象序列化与反序列化之pickle json详细解析
    目录引言picklejson尾语引言 将对象的状态信息转换为可以存储或传输的形式的过程叫作序列化 类似地从序列化后的数据转换成相对应的对象叫作 反序列化 本文介绍 Python 将对...
    99+
    2024-04-02
  • JavaScript解析及序列化JSON的示例分析
    这篇文章将为大家详细讲解有关JavaScript解析及序列化JSON的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。具体如下:JSON 之所以这么流行,是因为 J...
    99+
    2024-04-02
  • Swift 中的 JSON 反序列化示例详解
    目录业界常用的几种方案手动解码方案,如 Unbox(DEPRECATED)阿里开源的 HandyJSON基于 Sourcery 的元编程方案Swift build-in API Co...
    99+
    2024-04-02
  • Go语言中序列化与反序列化示例详解
    目录前言序列化array、slice、map、struct对象序列化的接口反序列化slice、map、struct反序列化总结前言 Go语言的序列化与反序列化在工作中十分常用,在Go...
    99+
    2024-04-02
  • Python的pickle序列化和JSON序列化实例分析
    本文小编为大家详细介绍“Python的pickle序列化和JSON序列化实例分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“Python的pickle序列化和JSON序列化实例分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一...
    99+
    2023-06-30
  • JavaIO之序列化与反序列化详解
    目录1、什么是序列化与反序列化?2、为什么要做序列化?3、Java 怎么进行序列化?总结1、什么是序列化与反序列化? 序列化:指把堆内存中的 Java 对象数据,通过某种方式把对象存...
    99+
    2024-04-02
  • JavaScript如何实现基于JSON的序列化和反序列化
    这篇文章将为大家详细讲解有关JavaScript如何实现基于JSON的序列化和反序列化,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。基于JSON的序列化和反序列化(ser...
    99+
    2024-04-02
  • Python常用标准库详解(pickle序列化和JSON序列化)
    目录常用的标准库序列化模块序列化和反序列化使用场景dumps & loadsdump & loadJSON序列化模块使用场景支持的数据类型JSON和pickle的区别...
    99+
    2024-04-02
  • SpringBoot之Json的序列化和反序列化问题怎么解决
    这篇文章主要讲解了“SpringBoot之Json的序列化和反序列化问题怎么解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“SpringBoot之Json的序列化和反序列化问题怎么解决”吧...
    99+
    2023-07-02
  • Java基础之序列化与反序列化详解
    目录1、什么是序列化与反序列化?2、Java如何实现序列化和反序列化?3、如何自定义序列化和反序列化呢?4、writeObject和readObject方法5、serializabl...
    99+
    2024-04-02
  • 实现JSON序列化和反序列化的方法在Golang中
    Golang中JSON序列化和反序列化的实现方式 JSON (JavaScript Object Notation) 是一种常用的数据交换格式,它以文本的形式表示结构化数据。在Golang中,我们可以使用内置...
    99+
    2024-01-29
    Golang 序列化 JSON 实现方式 反序列化
  • Java IO流对象的序列化和反序列化实例详解
    Java—IO流 对象的序列化和反序列化序列化的基本操作  1.对象序列化,就是将Object转换成byte序列,反之叫对象的反序列化。  2.序列化流(ObjectOutputStream),writeObject 方法用于将对象写入输出...
    99+
    2023-05-31
    java io流 序列化
  • react-diagram 序列化Json解读案例分析
    本文目标 本文档的目标在于解释react-diagram框架模型序列化的Json,由于缺乏文档,我这边只能通过不断尝试和调试来进行测试。 序列化案例1:空画布 { "id"...
    99+
    2024-04-02
  • flutter中的JSON和序列化方法及使用详解
    目录引言哪种JSON序列化方法适合手动进行序列化使用代码自动序列化Flutter 中是否有 GSON/Jackson/Moshi 之类的序列化类库?使用dart:convert内置库...
    99+
    2023-01-12
    flutter JSON序列化 flutter JSON
  • Go语言中Json序列化反序列化及文件读写的示例分析
    这篇文章主要介绍Go语言中Json序列化反序列化及文件读写的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!概述JSON(JavaScript Object Notation,JavaScript对象表示法)是...
    99+
    2023-06-25
  • 详解php反序列化之字符逃逸法
    目录1.先说关键字符变多例题1例题22.关键字符减少总结按我的理解,反序列化的过程就是碰到;}与最前面的{配对后,便停止反序列化。如下序列化: <php class Test ...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作