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 相关文章推荐
实例详解jQuery表单验证插件validate
Jan 18 Javascript
JavaScript随机打乱数组顺序之随机洗牌算法
Aug 02 Javascript
微信小程序 Storage API实例详解
Oct 02 Javascript
Angularjs手动解析表达式($parse)
Oct 12 Javascript
JS中跨页面调用变量和函数的方法(例如a.js 和 b.js中互相调用)
Nov 01 Javascript
AngularJS变量及过滤器Filter用法分析
Nov 22 Javascript
angular.js + require.js构建模块化单页面应用的方法步骤
Jul 19 Javascript
详解HTML5 使用video标签实现选择摄像头功能
Oct 25 Javascript
Servlet3.0与纯javascript通过Ajax交互的实例详解
Mar 18 Javascript
vue+iview 实现可编辑表格的示例代码
Oct 31 Javascript
详解vue项目中使用token的身份验证的简单实践
Mar 08 Javascript
JS中的继承操作实例总结
Jun 06 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
Apache设置虚拟WEB
2006/10/09 PHP
利用 window_onload 实现select默认选择
2006/10/09 PHP
php数组总结篇(一)
2008/09/30 PHP
PHP 错误处理机制
2015/07/06 PHP
ThinkPHP实现生成和校验验证码功能
2017/04/28 PHP
php面向对象程序设计入门教程
2019/06/22 PHP
跨浏览器的事件对象介绍
2012/06/27 Javascript
基于JQuery 选择器使用说明介绍
2013/04/18 Javascript
键盘KeyCode值列表汇总
2013/11/26 Javascript
理解Javascript图片预加载
2016/02/23 Javascript
jquery点击改变class并toggle的实现代码
2016/05/15 Javascript
第六篇Bootstrap表格样式介绍
2016/06/21 Javascript
Three.js学习之Lamber材质和Phong材质
2016/08/04 Javascript
原生js仿浏览器滚动条效果
2017/03/02 Javascript
node文件上传功能简易实现代码
2017/06/16 Javascript
JS中图片压缩的方法小结
2017/11/14 Javascript
express如何使用session与cookie的方法
2018/01/30 Javascript
layui默认选中table的CheckBox复选框方法
2019/09/19 Javascript
关于layui时间回显问题的解决方法
2019/09/24 Javascript
详解Python中的多线程编程
2015/04/09 Python
python采集百度百科的方法
2015/06/05 Python
python去除字符串中的换行符
2017/10/11 Python
Python UnboundLocalError和NameError错误根源案例解析
2018/10/31 Python
对DataFrame数据中的重复行,利用groupby累加合并的方法详解
2019/01/30 Python
使用 Python ssh 远程登陆服务器的最佳方案
2020/03/06 Python
python3代码输出嵌套式对象实例详解
2020/12/03 Python
Hotels.com加拿大:领先的在线住宿网站
2018/10/05 全球购物
英语专业大学生求职简历的自我评价
2013/10/18 职场文书
廉政教育的心得体会
2014/09/01 职场文书
总经理检讨书范文
2015/02/16 职场文书
小学教师师德师风承诺书
2015/04/28 职场文书
母亲去世追悼词
2015/06/23 职场文书
创业计划书之酒厂
2019/10/14 职场文书
小米11和iphone12哪个值得买?小米11对比iphone12评测
2021/04/21 数码科技
深入理解redis中multi与pipeline
2021/06/02 Redis
Python装饰器详细介绍
2022/03/25 Python