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 相关文章推荐
跟随鼠标旋转的文字
Nov 30 Javascript
JavaScript 继承使用分析
May 12 Javascript
jquery实现非叠加式的搜索框提示效果
Jan 07 Javascript
jQuery实现精美的多级下拉菜单特效
Mar 14 Javascript
AngularJs 指令详解及示例代码
Sep 01 Javascript
JS短信验证码倒计时功能的实现(没有验证码,只有倒计时)
Oct 27 Javascript
vue.js将unix时间戳转换为自定义时间格式
Jan 03 Javascript
jQuery插件FusionCharts绘制2D环饼图效果示例【附demo源码】
Apr 10 jQuery
动态创建Angular组件实现popup弹窗功能
Sep 15 Javascript
JavaScript实现焦点进入文本框内关闭输入法的核心代码
Sep 20 Javascript
vue js秒转天数小时分钟秒的实例代码
Aug 08 Javascript
JS实现放烟花效果
Mar 10 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
用phpmyadmin更改mysql5.0登录密码
2008/03/25 PHP
phpmyadmin3 安装配置图解教程
2012/03/29 PHP
PHP中使用asort进行中文排序失效的问题处理
2014/08/18 PHP
分享常见的几种页面静态化的方法
2015/01/08 PHP
php输出xml属性的方法
2015/03/19 PHP
php中final关键字用法分析
2016/12/07 PHP
用jscript启动sqlserver
2007/06/21 Javascript
$()JS小技巧
2007/07/21 Javascript
JS的递增/递减运算符和带操作的赋值运算符的等价式
2007/12/08 Javascript
常常会用到的截取字符串substr()、substring()、slice()方法详解
2015/12/16 Javascript
JavaScript利用闭包实现模块化
2017/01/13 Javascript
详解Nuxt.js部署及踩过的坑
2018/08/07 Javascript
JS实现Cookie读、写、删除操作工具类示例
2018/08/28 Javascript
[49:07]VGJ.T vs Optic Supermajor小组赛D组 BO3 第二场 6.3
2018/06/04 DOTA
使用Python编写Linux系统守护进程实例
2015/02/03 Python
解析Python中的生成器及其与迭代器的差异
2016/06/20 Python
python实现数据图表
2017/07/29 Python
python实现在pandas.DataFrame添加一行
2018/04/04 Python
Python 16进制与中文相互转换的实现方法
2018/07/09 Python
用python3教你任意Html主内容提取功能
2018/11/05 Python
Django  ORM 练习题及答案
2019/07/19 Python
家得宝加拿大家装网上商店:The Home Depot加拿大
2016/08/27 全球购物
美国在线纱线商店:Darn Good Yarn
2019/03/20 全球购物
俄罗斯宠物用品网上商店:ZooMag
2019/12/12 全球购物
医药工作者的求职信范文
2013/09/21 职场文书
销售类个人求职信范文
2013/09/25 职场文书
竞选团支书演讲稿
2014/04/28 职场文书
努力学习演讲稿
2014/05/10 职场文书
邹越感恩父母演讲稿
2014/08/28 职场文书
2014年党风廉政建设工作总结
2014/11/19 职场文书
团代会开幕词
2015/01/28 职场文书
教师节感想
2015/08/11 职场文书
2016教师学习党章心得体会
2016/01/15 职场文书
观看《信仰》心得体会
2016/01/15 职场文书
考生诚信考试承诺书(2016版)
2016/03/25 职场文书
Pygame Time时间控制的具体使用详解
2021/11/17 Python