原生js实现json.parse()和json.stringify()(代码片段)

yuan233 yuan233     2022-12-17     531

关键词:

- 首先JSON.stringify()是将js对象转换为JSON形式

实现思路:

通过递归调用,来实现对转换对象Object的深层value进行遍历,利用array的join实现最终字符串拼接

function myJsonStringify(obj) 
        let type = typeof obj;
        if (type !== "object" || type === null) 
            if (/string|undefined|function/.test(type)) 
                obj = " + obj + ";
            
            return String(obj);
         else 
            let json = [],
                arr = (obj && obj.constructor === Array);

            for (let k in obj) 
                let v = obj[k];
                let type = typeof v;

                if (/string|undefined|function/.test(type)) 
                    v = " + v + ";
                 else if (type === "object") 
                    v = myJsonStringify(v);
                

                json.push((arr ? "" : " + k + ":) + String(v));
            
            return (arr ? "[" : "") + String(json) + (arr ? "]" : "")
        
    

一个较为完整版的实现:

(function(NS)
var simpleTypes=["number","boolean","undefined","string","function"]
function stringify(object)
    var type=typeof object
    if(indexOf(simpleTypes,type)>-1)
        return parseSimpleObject(object);
    
    if(object instanceof Array)
        var len=object.length;
        var resArr=[];
        for(var i=0;i<len;i++)
            var itemType=typeof object[i];
            if(indexOf(simpleTypes,itemType)>-1)
                if(itemType!="undefined")
                    resArr.push(parseSimpleObject(object[i]));
                
                else
                    resArr.push(null)
                
            
            else
                resArr.push(stringify(object[i]))
            
        
        return "["+resArr.join(",")+ "]"
    
    if(object instanceof Object)
        if(object==null)
            return "null"
        
        var resArr=[]
        for(var name in object)
            var itemType=typeof object[name];
            if(indexOf(simpleTypes,itemType)>-1)
                if(itemType!=undefined)
                    resArr.push("\"" + name + "\":" + parseSimpleObject(object[name]))
                
            
            else
                resArr.push("\"" + name +"\":" +stringify(object[name]))
            
        
        return "" +resArr.join(",") +""
    

function parseSimpleObject(object)
    var type=typeof object;
    if(type=="string"||type=="function")
        return "\"" + object.toString().replace("\"","\\\"") + "\""
    
    if(type=="number"||type=="boolean")
        return object.toString()
    
    if(type=="undefined")
        return  "undefined"
    
    return  "\"" +object.toString().replace("\"","\\\"") +"\""

function indexOf(arr,val)
    for(var i=0;i<arr.length;i++)
        if(arr[i]===val)
            return i;
        
    
    return -1

NS.stringify=function(object,isEncodeZh)
    var res=stringify(object)
    if(isEncodeZh)
        var encodeRes="";
        for(var i=0;i<res.length;i++)
            if(res.charCodeAt(i)<Oxff)
                encodeRes+=res[i]
            
            else
                encodeRes+="\\u"+res.charCodeAt(i).toString(16);
            
        
        res=encodeRes
    
    return res;

)(window);

JSON.parse()是将JSON对象转换为js对象

实现方式:(2种)

eval()

var json="a":"1","b":2
 var obj=eval("("+json+")");

直接调用eval,会产生xss漏洞。

利用new Function()

第一种eval的方法,相当于无脑把JSON字符串塞进去,eval和Function都有着动态编译js代码的作用

var func=new Function(arg1,arg2,...,functionBody)
var jsonStr="age":20,"name":"jack"
var json=(new Function(return+jsonStr))()

 

json.parse()与json.stringify()

JSON.parse()将字符串转成JSON举个例子varstr=‘{"name":"cn","age":"2"}‘JSON.parse(str)结果:Objectage:"2"name:"cn"__proto__:Object注意:单引号写在{}外,每个属性名都必须用双引号,否则会抛出异常。 JSON.stringify将JSON对象转换为字符串vara={a:1,... 查看详情

通过json.stringfy()和json.parse(),实现对象或者数组深拷贝

   JavaScript中对象或者数组等引用类型,直接拷贝,改变一个另外一个也会改变;  下列代码在浏览器控制台执行:vararr=[1,2,3];vararr1=arr;arr1.push(4);console.log(arr);//[1,2,3,4]console.log(arr1);//[1,2,3,4]  通过JSON.stringfy( 查看详情

原生js中的常用方法的写法

1、js深度克隆的方法//第一种functiondeepClone(obj){varstr,newObj=objinstanceofArray?[]:{};if(typeofobj!==‘object‘){return;}elseif(window.json){str=JSON.stringify(obj);newObj=JSON.parse(str);}else{for(variinobj){n 查看详情

ReactJS 和 Node.JS [JSON.parse:JSON 数据的第 1 行第 1 列出现意外字符]

】ReactJS和Node.JS[JSON.parse:JSON数据的第1行第1列出现意外字符]【英文标题】:ReactJSandNode.JS[JSON.parse:unexpectedcharacteratline1column1oftheJSONdata]【发布时间】:2020-01-1118:58:40【问题描述】:我对这段代码感到困惑,所以我需要第三眼来寻... 查看详情

React JS:this.setState 和 JSON.parse

】ReactJS:this.setState和JSON.parse【英文标题】:ReactJS:this.setStateandJSON.parse【发布时间】:2018-07-2120:50:57【问题描述】:我有一个问题,我不知道如何解决它。我正在向我的api发出请求,它以这样的对象响应:"_id":"5a806648300caf0072c725... 查看详情

json.stringify(),json.parse(),tojson()方法使用

...ng,Number...)序列化为JSON字符串JSON.parse():将JSON数据解析为js原生值toJSON(),作为JSON.stringify中第二个参数(函数过滤器)补充,理解内部顺序很重要。假设把一个对象传入JSON.stringify()序列化对象的顺序如下:(1)如果存在toJSON()方法而且能 查看详情

json.parse(json.stringify())实现对对象的深拷贝(代码片段)

 JSON.parse(JSON.stringify(obj))我们一般用来深拷贝,其过程说白了就是利用JSON.stringify将js对象序列化(JSON字符串),再使用JSON.parse来反序列化(还原)js对象;序列化的作用是存储(对象本身存储的只是一个地址映射... 查看详情

js数组使用json.stringify和tostring的区别

js中eval()和$.parseJSON()的区别以及JSON.stringify()1.第一个区别是:安全性json格式非常受欢迎,而解析json的方式通常用JSON.parse()但是eval()方法也可以解析,这两者之间有什么区别呢?JSON.parse()之可以解析json格式的数据,并且会对要解... 查看详情

node.js JSON.parse reviver 不报告重复键?

】node.jsJSON.parsereviver不报告重复键?【英文标题】:node.jsJSON.parsereviverdoesn\'treportduplicatekeys?【发布时间】:2015-04-2220:49:27【问题描述】:我正在尝试使用JSON解析器来检测和保存重复键。我在node.js中使用JSON.parse()和一个reviver,... 查看详情

保存语法和 JSON.parse 代码时出错

】保存语法和JSON.parse代码时出错【英文标题】:Errorwhilesavingsyntax,andJSON.parsecode【发布时间】:2019-11-1417:03:36【问题描述】:constDiscord=require(\'discord.js\');constbot=newDiscord.Client();letcofig=require(\'./botconfig.json\');lettoken=config 查看详情

js中json.stringify()与json.parse()与eval()详解及使用案例

...机器解析和生成(一般用于网络传输速率)。 (1)JSON.parse函数  作用:将json字符串转换成json对象。语法:JSON.&n 查看详情

标签页(tab)切换的原生js,jquery和bootstrap实现

...课程Tab选项卡切换效果时做的总结和练手。原课程中只有原生js实现,jquery和bootstrap实现是我自己补上的。本节内容标签页(tab)切换的原生js实现标签页(tab)切换的jquery实现标签页(tab)切换的bootstrap实现标签页(tab)切换... 查看详情

json的序列化和反序列化eval()和parse()方法以及stringfy()方法

1、json解析的方法有两种:eval()和parse()方法eval()较危险,不光解析了字符串,还解析了js方法,无论何时用eval()都是非常危险的。-----不建议使用JSON.parse()较好,会解析出错误。例子[加上圆括号的目的是迫使eval函数在处理JavaScrip... 查看详情

`json.parse(json.stringfy())`进行深拷贝方法小结

...N字符串反序列化为一个js对象,通过这两个方法,也可以实现对象的深复制。用法简单,然而使用这种方法会有一些隐藏的坑:因为在序列化JavaScript对象时,所有函数和 查看详情

浅谈js中的json.stringify()和json.parse()

参考技术A我们知道,JSON.stringify()和JSON.parse()是一对处理JSON数据的方法,前者是将JSON对象序列化为字符串,而后者是将JSON字符串解析为JSON对象。但是你有较为深入地去了解过它们吗?它们分别可以传入几个参数以及每个参数对... 查看详情

原生js实现jquery的addclass和removeclass

代码如下:document.getElementById("btn").classList.add("active");document.getElementById("btn").classList.remove("active");  查看详情

json.parse()和json.stringify()

JSON.parse()和JSON.stringify():parse用于从一个字符串中解析出json对象,如下:varstr=‘{"name":"huangxiaojian","age":"23"}‘结果:JSON.parse(str) Objectage: "23"name: "huangxiaojian"__proto__: Objectstringi 查看详情

原生js实现删除class和添加class

内容来自百度搜索//判断样式是否存在functionhasClass(ele,cls){    returnele.className.match(newRegExp("(\s|^)"+cls+"(\s|$)"));}//为指定的dom元素添加样式functionaddClass(ele,cls){    if(! 查看详情