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 相关文章推荐
分享一个asp.net pager分页控件
Jan 04 Javascript
JavaScript 高级篇之闭包、模拟类,继承(五)
Apr 07 Javascript
基于jQuery.Validate验证库知识点的详解
Apr 26 Javascript
基于jquery插件制作左右按钮与标题文字图片切换效果
Nov 07 Javascript
alert和confirm功能介绍
May 21 Javascript
javascript实现微信分享
Dec 23 Javascript
原生JS版和jquery版实现checkbox的全选/全不选/点选/行内点选(Mr.Think)
Oct 29 Javascript
使用jQuery实现鼠标点击左右按钮滑动切换
Aug 04 jQuery
jquery点击回车键实现登录效果并默认焦点的方法
Mar 09 jQuery
angularJs中ng-model-options设置数据同步的方法
Sep 30 Javascript
小程序点击图片实现png转jpg
Oct 22 Javascript
Vue中this.$nextTick的作用及用法
Feb 04 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
PHP将DateTime对象转化为友好时间显示的实现代码
2011/09/20 PHP
修改Laravel5.3中的路由文件与路径
2016/08/10 PHP
PHP在同一域名下两个不同的项目做独立登录机制详解
2017/09/22 PHP
js与jquery获取父元素,删除子元素的两种不同方法
2014/01/09 Javascript
js父窗口关闭时子窗口随之关闭完美解决方案
2014/04/29 Javascript
完美兼容各大浏览器的jQuery插件实现图片切换特效
2014/12/12 Javascript
jQuery选择器之基本选择器与层次选择器
2015/03/03 Javascript
javascript判断网页是关闭还是刷新
2015/09/12 Javascript
限制文本框只能输入数字||只能是数字和小数点||只能是整数和浮点数
2016/05/27 Javascript
基于Bootstrap实现下拉菜单项和表单导航条(两个菜单项,一个下拉菜单和登录表单导航条)
2016/07/22 Javascript
最实用的jQuery分页插件
2016/10/09 Javascript
微信小程序图片宽100%显示并且不变形
2017/06/21 Javascript
vue.js 实现输入框动态添加功能
2018/06/25 Javascript
JavaScript设计模式之单例模式原理与用法实例分析
2018/07/26 Javascript
怎样使你的 JavaScript 代码简单易读(推荐)
2019/04/16 Javascript
使用react context 实现vue插槽slot功能
2019/07/18 Javascript
深入探索VueJS Scoped CSS 实现原理
2019/09/23 Javascript
vue中 v-for循环的用法详解
2020/02/19 Javascript
Vue移动端用淘宝弹性布局lib-flexible插件做适配的方法
2020/05/26 Javascript
Python smtplib实现发送邮件功能
2018/05/22 Python
Python绘制KS曲线的实现方法
2018/08/13 Python
Python解析Excle文件中的数据方法
2018/10/23 Python
Pandas GroupBy对象 索引与迭代方法
2018/11/16 Python
Django集成CAS单点登录的方法示例
2019/06/10 Python
python的pygal模块绘制反正切函数图像方法
2019/07/16 Python
python将时分秒转换成秒的实例
2019/12/07 Python
使用ITK-SNAP进行抠图操作并保存mask的实例
2020/07/01 Python
HTML5中图片之间的缝隙完美解决方法
2017/07/07 HTML / CSS
canvas中普通动效与粒子动效的实现代码示例
2019/01/03 HTML / CSS
在购买印度民族服饰:Soch
2020/09/15 全球购物
简述数据库的设计过程
2015/06/22 面试题
网上常见的一份Linux面试题(多项选择部分)
2014/09/09 面试题
房地产销售大学生自我评价分享
2013/11/11 职场文书
产品促销活动策划书
2014/01/15 职场文书
全国法院系统开展党的群众路线教育实践活动综述(全文)
2014/10/25 职场文书
创业计划书之密室逃脱
2019/11/08 职场文书