`
oszerone
  • 浏览: 13008 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

模拟原生的JSON.stringify方法

阅读更多

解决ie6、ie7没有原生js对象转JSON字符串的问题

JSON1.stringify1 使用函数递归调用方式,操作的js对象受限于浏览器的堆栈大小(大概几千或一万)

JSON1.stringify2 使用数组栈方式,速度快,不受限于浏览器的堆栈大小,受限于数组的大小(可忽略)

 

和原生JSON.stringify的区别:

  1. 保留了undefined的值(无法兼容后台java等不支持undefined的语言)
  2. 未支持replacer等后续参数
  3. 未支持对象的toJSON方法,只支持基本的undefined、null、number、string、boolean类型,以及包含这些类型的数组和键值对对象

 

var JSON1 = {
	stringify2 : function (jsObj) { //使用数组栈方式
		var stack1 = [];
		var stack2 = [];
		var process = function(obj){
			if(obj && typeof obj == "object"){
				return obj;
			}else if(typeof obj == "string"){
				return "\"" + obj.replace(/\\/g, "\\\\").replace(/"/g, "\\\"") + "\"";
			}else{
				return obj + "";
			}
		}
		stack1.push(process(jsObj));
		
		while(stack1.length){
			var o = stack1.pop();
			if(typeof o == "object"){
				/*
				var isArray = o instanceof Array;
				stack1.push(isArray ? "[" : "{");
				var i = null;
				if(isArray){
					for(i = 0; i < o.length; i++){
						stack1.push(process(o[i]));
						stack1.push(",");
					}
				}else{
					for(i in o){
						stack1.push("\"" + i + "\":");
						stack1.push(process(o[i]));
						stack1.push(",");
					}
				}
				if(i){//移除最后一个无效的逗号[,]
					stack1.pop();
				}
				stack1.push(isArray ? "]" : "}");
				*/
				var i = null;//必须显示的设置为null,防止空对象时保留了上一次循环的结果
				if(o instanceof Array){
					stack1.push("[");
					for(i = 0; i < o.length; i++){
						stack1.push(process(o[i]));
						stack1.push(",");
					}
					if(i){//移除最后一个无效的逗号[,]
						stack1.pop();
					}
					stack1.push("]");
				}else{
					stack1.push("{");
					for(i in o){
						stack1.push("\"" + i + "\":");
						stack1.push(process(o[i]));
						stack1.push(",");
					}
					if(i){//移除最后一个无效的逗号[,]
						stack1.pop();
					}
					stack1.push("}");
				}
			}else{//字符串(已经处理)
				stack2.unshift(o);
			}
		}
		return stack2.join("");
	},
	stringify1 : function (jsonObj) { //使用函数递归调用的方法
		var jsonBuffer = [];
		var type = typeof jsonObj;//undefined,boolean,number,string,object
		if(type === "object"){
			if(jsonObj === null){
				jsonBuffer.push(jsonObj + "");
			}else{
				if(jsonObj instanceof Array){
					jsonBuffer.push("[");
					for(var i = 0; i < jsonObj.length; i++){
						jsonBuffer.push(JSON1.stringify1(jsonObj[i]));
						jsonBuffer.push(",");
					}
					if(i){
						jsonBuffer.pop();//移除最后一个无效的逗号[,]
					}
					jsonBuffer.push("]");
				}else{
					jsonBuffer.push("{");
					for(var j in jsonObj){
						jsonBuffer.push("\"" + j + "\":" + JSON1.stringify1(jsonObj[j]));
						jsonBuffer.push(",");
					}
					if(j){
						jsonBuffer.pop();//移除最后一个无效的逗号[,]
					}
					jsonBuffer.push("}");
				}
			}
		}else if(type == "string"){
			jsonBuffer.push("\"" + jsonObj.replace(/\\/g, "\\\\").replace(/"/g, "\\\"") + "\"");
		}else{
			jsonBuffer.push(jsonObj + "");
		}
		return jsonBuffer.join("");
	}
}

 

 

分享到:
评论

相关推荐

    json2.js json.js

    在JavaScript中,原生的JSON对象在ECMAScript 5版本(ES5)及更新的环境中被内置,提供了`JSON.parse()`和`JSON.stringify()`两个核心方法。然而,在ES5之前的版本,如IE6和IE7,对JSON的支持并不完全。这就是json2....

    json.js和使用示例

    总结来说,`json.js`是一个针对IE6的JSON兼容库,它实现了JSON.parse和JSON.stringify方法,使得在不支持JSON的旧版浏览器中也能进行JSON数据的序列化和反序列化。这个库的使用极大地扩展了JSON在旧浏览器中的适用性...

    Json2.js.zip_json2.js

    `json2.js` 是由Douglas Crockford开发的一个JavaScript库,主要用于在那些不支持原生JSON解析和序列化的老旧浏览器中添加对JSON的支持。这个库对于学习和理解JSON在JavaScript中的应用至关重要。 标题中的"Json2....

    json2.js+介绍

    `json2.js` 是Douglas Crockford开发的一个JavaScript库,主要用于处理JSON格式数据,特别是在那些不支持原生JSON解析和序列化的老版本浏览器中。 在JavaScript中,`JSON.stringify()`方法用于将JavaScript值转换为...

    json2.js下载

    `json2.js` 是一个JavaScript库,由Douglas Crockford 创建,主要用于在那些不支持原生JSON解析和序列化的老版本浏览器上提供JSON功能。 在JavaScript中,JSON是一个内置对象,提供了`parse()`和`stringify()`两个...

    json数据组装

    除了JavaScript原生的JSON处理方法,还有一些第三方库,如`json-util`,提供了更丰富的功能,如深度克隆、格式化、验证等。例如,使用`json-util`库,我们可以方便地合并两个JSON对象: ```javascript const ...

    ajax 和 JSON2解析

    在JSON2.js未引入之前,一些较早的浏览器不支持原生的JSON.parse()和JSON.stringify()方法,这两个方法分别用于解析JSON字符串和转换JavaScript对象为JSON字符串。JSON2库确保了在所有浏览器中都能安全地使用JSON。 ...

    json对象转字符串如何实现

    在现代浏览器中,提供了原生的API支持,通过`JSON.stringify()`方法,可以非常方便地完成这种转换。然而,在一些旧版的浏览器中,如IE6等,并不完全支持这一API,这时我们就需要手动实现对象到字符串的转换。 首先...

    js代码-ES5实现map的方法

    为了解决这个问题,我们可以将非字符串键转换为字符串,例如使用JSON.stringify()方法。 ```javascript function ES5Map() { this.store = {}; } ES5Map.prototype.set = function(key, value) { var keyStr = ...

    原生ajax模拟判断用户名是否已注册

    var data = JSON.stringify({username: username}); xhr.send(data); ``` 在服务器端,比如PHP,我们需要接收并处理这些数据。检查数据库中是否存在该用户名,然后返回相应的JSON响应,例如: ```php header('...

    Ejercicio001:没有配置,也没有puede usar json

    `JSON.parse()`用于将JSON字符串转换为JavaScript对象,而`JSON.stringify()`方法则用于将JavaScript对象转换为JSON字符串。例如: ```javascript let jsonString = '{"name": "John", "age": 30, "city": "New ...

    3分钟掌握常用的JS操作JSON方法总结

    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它基于JavaScript的原生格式,因此在JavaScript中处理JSON数据不需要特殊的API或工具包。JSON数据主要由两种结构组成:对象和数组。对象以大括号“{...

    JS如何把字符串转换成json

    为了在不支持JSON的浏览器(如IE8的兼容模式,IE7和IE6)中使用JSON,可以通过引入第三方库`json2.js`(最初由Douglas Crockford开发)来模拟JSON对象和其方法。这个库可以从&lt;https://github....

    JavaScript_无限画布数据的开放文件格式.zip

    在JavaScript中,我们可以通过创建对象来表示这些元素,然后利用JSON.stringify()方法将这些对象转换为JSON字符串进行存储,需要时再用JSON.parse()方法恢复。 为了实现无限画布,开发者可能利用了HTML5的Canvas ...

    ie6-10兼容性解决-js.zip

    5. **JSON支持**:IE7及更早版本不支持原生的JSON对象,需要引入JSON.parse和JSON.stringify的polyfill。 6. **Function.prototype.call和.apply**:IE6-8在某些情况下对这两个方法的实现有bug,可能需要额外的处理...

    HTML5新的WEB标准和浏览器支持[参考].pdf

    ECMAScript 5引入了原生的JSON支持,提供了`JSON.parse()`和`JSON.stringify()`方法,它们在性能和安全性上远超`eval()`。浏览器如Firefox 3.5+和IE8+已经内置了对JSON的支持。对于不支持的浏览器,可以使用Douglas ...

    JS模拟MSN

    JS中可以方便地使用`JSON.stringify`和`JSON.parse`来序列化和反序列化数据。 5. **CSS样式控制**:为了重现MSN的视觉效果,开发者需要使用JavaScript操作CSS样式。例如,改变元素的颜色、位置、大小等属性,或者...

    prototype1.4.0

    1. **对象扩展**:Prototype 1.4.0 引入了对JavaScript原生对象的扩展,比如Array、String、Date等,增加了丰富的实用方法,如`Array.prototype.each`、`String.prototype.include` 和 `Date.prototype.toJSON`,...

    prototype.js框架资料

    3. **JSON支持**:内置对JSON的支持,提供JSON.parse()和JSON.stringify()方法,方便数据的序列化和反序列化。 4. **Script.aculo.us库**:Prototype.js通常与Script.aculo.us库结合使用,后者提供了丰富的视觉效果...

    Javascript的IE和Firefox兼容性问题集合

    4. **JSON支持**:IE7及以下版本不支持原生JSON对象,需要使用JSON.stringify和JSON.parse进行转换。可以引入第三方JSON库,如json2.js。 5. **数组扩展方法**:IE9以下版本不支持数组的forEach、map等扩展方法,...

Global site tag (gtag.js) - Google Analytics