json对象转字符串如何实现


Posted in Javascript onDecember 02, 2012

背景:大部分浏览器已经实现了json对象转字符串的原生api支持,那在较低版本浏览器浏览器——如大家最喜爱的IE6——里如何实现呢?
首先运行以下方法,测试各种情况下,JSON.stringify的输出,这有助于下文代码的实现以及测试。用例不一定完整,欢迎补充

function test_toStringify(){ 

var result = { 

"JSON.stringify(undefined)": JSON.stringify(undefined), 

"JSON.stringify(null)": JSON.stringify(null), 

"JSON.stringify(123)": JSON.stringify(123), 

"JSON.stringify(true)": JSON.stringify(true), 

"JSON.stringify('')": JSON.stringify(''), 

"JSON.stringify('abc')": JSON.stringify('abc'), 

"JSON.stringify(null)": JSON.stringify(null), 

"JSON.stringify([1,2,3])": JSON.stringify([1,2,3]), 

"JSON.stringify([undefined, undefined])": JSON.stringify([undefined, undefined]), 

"JSON.stringify({name:'chyingp', age:24, u:undefined})": JSON.stringify({name:'chyingp', age:24, u:undefined}) 

}; 

var str = ''; 

for(var key in result){ 

if(typeof result[key] === 'string'){ 

str += key + " : '" + result[key] + "'\n"; 

}else{ 

str += key + " : " + result[key] + "\n"; 

} 

} 

console.log(str); 

} 

test_toStringify();

输出结果如下:
JSON.stringify(undefined) : undefined 

JSON.stringify(null) : 'null' 

JSON.stringify(123) : '123' 

JSON.stringify(true) : 'true' 

JSON.stringify('') : '""' 

JSON.stringify('abc') : '"abc"' 

JSON.stringify([1,2,3]) : '[1,2,3]' 

JSON.stringify([undefined, undefined]) : '[null,null]' 

JSON.stringify({name:'chyingp', age:24, u:undefined}) : '{"name":"chyingp","age":24}'

下面是json对象转字符串的代码实现:
function is_number(obj){ return Object.prototype.toString.call(obj)==='[object Number]'; } 

function is_boolean(obj){ return Object.prototype.toString.call(obj)==='[object Boolean]'; } 

function is_string(obj){ return Object.prototype.toString.call(obj)==='[object String]'; } 

function is_null(obj){ return Object.prototype.toString.call(obj)==='[object Null]'; } 

function is_undefined(obj){ return Object.prototype.toString.call(obj)==='[object Undefined]'; } 

function is_object(obj){ return Object.prototype.toString.call(obj)==='[object Object]'; } 

function is_array(obj){ return Object.prototype.toString.call(obj)==='[object Array]'; } 

function is_function(obj){ return Object.prototype.toString.call(obj)==='[object Function]'; } 

function quote(str){ return '"' + str + '"'; } 

var basic_map = { 

'[object Undefined]': true, 

'[object Number]': true, 

'[object Null]': true, 

'[object Boolean]': true 

} 

function basic_type(obj){ return basic_map[ Object.prototype.toString.call(obj) ]; } 

JSON = window.JSON || {}; 

//其实就是JSON.stringify 

JSON.toStr = function(obj){ 

if(is_string(obj) || is_null(obj) || is_number(obj) || is_boolean(obj)) return quote(obj); 

if(is_undefined(obj)) return obj; 

if(is_array(obj)){ 

var left = "[", 

middle = [], 

right = "]", 

value; 

var callee = arguments.callee; 

for(var i=0,len=obj.length; i<len; i++){ 

var value = obj[i]; 

if( typeof value === 'undefined' ){ 

middle.push(null+''); 

}else{ 

if( basic_type(value) ){ 

middle.push( value ) 

}else{ 

middle.push( callee(obj[i]) ) 

} 

} 

} 

return left+ middle.join(",") +right; 

} 

if(is_object(obj)){ 

var left = "{", 

middle = [], 

right = "}", 

value ; 

var callee = arguments.callee; 

for(var key in obj){ 

var value = obj[key]; 

if(typeof obj[key] === 'undefined') continue; 

if( basic_type(value) ){ 

middle.push( quote(key) + ':'+ value ); 

}else{ 

middle.push( quote(key) + ':'+ callee(value) ); 

} 

} 

return left + middle.join(', ') + right; 

} 

}; 

!JSON.stringify && (JSON.stringify = JSON.toStr);

以上代码仅为练手用,如有冗余及效率问题敬请见谅。如有错误则请帮忙指出 :)
Javascript 相关文章推荐
关于UTF-8的客户端用AJAX方式获取GB2312的服务器端乱码问题的解决办法
Nov 30 Javascript
使用Jquery搭建最佳用户体验的登录页面之记住密码自动登录功能(含后台代码)
Jul 10 Javascript
JavaScript高级程序设计阅读笔记(六) ECMAScript中的运算符(二)
Feb 27 Javascript
JavaScript原型链示例分享
Jan 26 Javascript
jquery 字符串切割函数substring的用法说明
Feb 11 Javascript
使用 JavaScript 进行函数式编程 (一) 翻译
Oct 02 Javascript
jquery事件的ready()方法使用详解
Nov 11 Javascript
JavaScript常用数组算法小结
Feb 13 Javascript
深入理解选择框脚本[推荐]
Dec 13 Javascript
jQuery Validate验证框架详解(推荐)
Dec 17 Javascript
详解node如何让一个端口同时支持https与http
Jul 04 Javascript
p5.js实现简单货车运动动画
Oct 23 Javascript
javascript 构造函数强制调用经验总结
Dec 02 #Javascript
js精度溢出解决方案
Dec 02 #Javascript
JavaScript词法作用域与调用对象深入理解
Nov 29 #Javascript
浏览器加载、渲染和解析过程黑箱简析
Nov 29 #Javascript
javascript控制swfObject应用介绍
Nov 29 #Javascript
javascript 保存文件到本地实现方法
Nov 29 #Javascript
jquery连缀语法如何实现
Nov 29 #Javascript
You might like
德生BCL3000的电路分析和打磨
2021/03/02 无线电
ninety plus是什么?ninety plus咖啡好吗?
2021/03/04 新手入门
PHP如何得到当前页和上一页的地址?
2006/11/27 PHP
那些年一起学习的PHP(一)
2012/03/21 PHP
php获取CSS文件中图片地址并下载到本地的方法
2014/12/02 PHP
php获取文章内容第一张图片的方法示例
2017/07/03 PHP
laravel csrf排除路由,禁止,关闭指定路由的例子
2019/10/21 PHP
基于JQuery框架的AJAX实例代码
2009/11/03 Javascript
Whatever:hover 无需javascript让IE支持丰富伪类
2010/06/29 Javascript
Document对象内容集合(比较全)
2010/09/06 Javascript
javascript string字符串优化问题
2011/07/31 Javascript
jQuery Pagination Ajax分页插件(分页切换时无刷新与延迟)中文翻译版
2013/01/11 Javascript
javascript获得网页窗口实际大小的示例代码
2013/09/21 Javascript
JavaScript中的prototype和constructor简明总结
2014/04/05 Javascript
使用jQuery.Qrcode插件在客户端动态生成二维码并添加自定义Logo
2016/09/01 Javascript
详解微信第三方小程序代开发
2017/06/23 Javascript
基于PHP pthreads实现多线程代码实例
2020/06/24 Javascript
JavaScript实现图片放大预览效果
2020/11/02 Javascript
Python字符串的encode与decode研究心得乱码问题解决方法
2009/03/23 Python
浅谈Python的Django框架中的缓存控制
2015/07/24 Python
python 3.0 模拟用户登录功能并实现三次错误锁定
2017/11/01 Python
python实现图片批量压缩程序
2018/07/23 Python
python爬虫自动创建文件夹的功能
2018/08/01 Python
详解Python3定时器任务代码
2019/09/23 Python
keras读取训练好的模型参数并把参数赋值给其它模型详解
2020/06/15 Python
python简单实现9宫格图片实例
2020/09/03 Python
Python3如何使用range函数替代xrange函数
2020/10/05 Python
python中openpyxl和xlsxwriter对Excel的操作方法
2021/03/01 Python
Elemis美国官网:英国的第一豪华护肤品牌
2018/03/15 全球购物
C语言笔试题回忆
2015/04/02 面试题
python+selenium小米商城红米K40手机自动抢购的示例代码
2021/03/24 Python
开办大学饮食联盟创业计划书
2014/01/29 职场文书
无犯罪记录证明范本
2014/09/15 职场文书
营业用房租赁协议书
2014/11/26 职场文书
三种方式清除vue路由跳转router-link的历史记录
2022/04/10 Vue.js
在NumPy中深拷贝和浅拷贝相关操作的定义和背后的原理
2022/04/14 Python