JSON.stringify与JSON.parse怎么实现


这篇“JSON.stringify与JSON.parse怎么实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“JSON.stringify与JSON.parse怎么实现”文章吧。JSON 的 stringifyparse 两个方法在平时的工作中也很常用,如果没有一些特殊的类型,是实现数据深拷贝的一个原生方式。下面就这两个方法的一个手动实现思路。JSON.stringify 方法用于将 JavaScript 值转换为 JSON 字符串。该方法有三个参数:data: 需要转换的数据replacer:用于转换结果的对象或者数组,可以函数或者数组space:文本添加缩进、空格和换行符,可以是数字或者字符串,数字的最大值是 10,字符串的最大长度是 10下面的测试只用到这些类型: number,string,function,object,array,null,undefined,map,set,weakmap,weakset但是 JavaScript 数据的严格类型远远不止这几个。首先我们用 JSON.stringify 来打印结果:根据上面的结果,我们可以发现对象内的 function, undefined 被剔除了,map, set 等都被动的转换成了空对象。而数组内的 functionundefined 被替换成了 null。所以我们可以根据上述规则写一个简单的 stringify 方法:实现几个辅助函数:到这里就实现了 stringify 的简单版本。下面可以简单测试一下:后面还有两个参数,我们先实现第三个,第二个参数的作用等下在实现。space 主要是用于添加空格、换行、缩进,但是只要 space 的值是合法的,换行符是默认加上一个的。所以我们要改下 stringify 的方法:对于 space 的不同非法的值,我们可以在控制台上进行一些简单的测试就可以得出,像 -1 这种其实是不生效的。而我处理的是只能是数字和字符串,数字必须是 1 – 10,字符串的最长长度是 10 位,其余的都重置为 undefined。因为像数组和对象的这种嵌套,缩进其实是要跟着动的,这里就新增了 indent 字段,初始为 1,后续递归就 + 1。replacer 参数有两个类型:数组类型是用来过滤对象类型内的字段,只保留数组内的 key函数类型就是在数组和对象遍历的时候,开发者可以自定义某些类型的字符串方式所以这里我免费云主机域名们需要修改三处地方:到这里, stringify 的方法差不多了。下面是完整代码:stringify 方法的实现还是比较简单的,在一些笔试中还有可能会有相关需要实现的题。而 JSON.parse 则是需要将合法的 json 字符串转换成对象,这里就需要用到一个概念:有限状态自动机这里只做简单的介绍:有限状态机(Finite State Machine),是指任意时刻都处于有限状态集合中的某一状态。当其获得一个输入字符时,将从当前状态转换到另一个状态或者仍然保持当前状态。可以结合当前 json 字符串的场景来简单理解一下:我们有如下一个字符串:然后定义几个状态:因为 json 字符串是非常规则的字符串,所以我们可以结合正则表达式来提取相关步骤的数据,在字符串中的 ' 'tnr 等也是可以的,所以在正则中需要考虑并且替换。然后定义几个辅助函数:在上面定义状态的时候,解析对象、数组和数组值的时候只有开始状态,而没有结束状态。只是结束状态统一放入 isEnd 函数中,。下面开始定义 parseData 函数:第一步INIT 中,先去掉前面的空格、换行等字符,示例:然后再判读第一个字符是什么:如果是 {,则将状态转移到 OBJECTSTART,将 res 赋值一个空对象如果是 [,则将状态转移到 ARRAYSTART,将 res 赋值一个空数组如果都不是,则就是一个值,可以用对象解析属性值的方法来解析,判读是否是合法的字符串所以这里的状态转移到了对象解析 OBJECTSTART第二步OBJECTSTART 中,消费{,将状态转移到 OBJVALSTART, 剩余字符数据:第三步先获取 key: 等数组并消费,剩余字符数据:先判读后续字符的第一个字符是什么:如果是 { 或者 [,则开启一个新的状态机否则直接用 parseObjValue 解析值最后将状态转移至 OBJVALEND第四步如果后面匹配出来的字符是 ,,则表示后续还有其它的对象属性,我们需要将状态重新转移到 OBJVALSTART, 如果是其它的 } 或者 ],则会在此次消费完毕,然后在 isEnd 中会退出状态机。后续剩余字符的变化会依照上数状态的变化而进行字符消费:数组的处理如果第一个字符为 [,则会开启新的状态机,状态也会转换为 ARRAYSTART,然后在 ARRAYSTART 状态内进行数组值的转换。到这里整个 JSON.parse 的实现思路差不多,但是上述的流程应该有没考虑到的地方,但是大体差不多,只是边界的处理问题。测试示例:结果:以上就是关于“JSON.stringify与JSON.parse怎么实现”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注百云主机行业资讯频道。

相关推荐: C++的string容器如何使用

本篇内容介绍了“C++的string容器如何使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!本质:string是C++风格的字符串,而string本质上是一个…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

Like (0)
Donate 微信扫一扫 微信扫一扫
Previous 03/30 20:52
Next 03/30 20:52

相关推荐