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 相关文章推荐
Javascript下的keyCode键码值表
Apr 10 Javascript
JavaScript prototype 使用介绍
Aug 29 Javascript
js中同步与异步处理的方法和区别总结
Dec 25 Javascript
jQuery+PHP实现微信转盘抽奖功能的方法
May 25 Javascript
Angular 路由route实例代码
Jul 12 Javascript
jquery实现(textarea)placeholder自动换行
Dec 22 Javascript
Vue.js路由vue-router使用方法详解
Mar 20 Javascript
php 解压zip压缩包内容到指定目录的实例
Jan 23 Javascript
JS实现点餐自动选择框(案例分析)
Dec 10 Javascript
JavaScript canvas实现雪花随机动态飘落
Feb 08 Javascript
Vue中使用wangeditor富文本编辑的问题
Feb 07 Vue.js
vue使用element-ui按需引入
May 20 Vue.js
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
js 匿名调用实现代码
2009/06/19 Javascript
js操作css属性实现div层展开关闭效果的方法
2015/05/11 Javascript
jquery中validate与form插件提交的方式小结
2016/03/26 Javascript
Javascript之Date对象详解
2016/06/07 Javascript
jQuery Easyui DataGrid点击某个单元格即进入编辑状态焦点移开后保存数据
2016/08/15 Javascript
微信小程序 action-sheet底部菜单详解
2016/10/27 Javascript
vue 中自定义指令改变data中的值
2017/06/02 Javascript
微信小程序后台解密用户数据实例详解
2017/06/28 Javascript
vue-router+nginx 非根路径配置方法
2018/06/30 Javascript
深入理解Vue父子组件生命周期执行顺序及钩子函数
2018/08/12 Javascript
手把手教你写一个微信小程序(推荐)
2018/10/17 Javascript
JS图片预加载三种实现方法解析
2020/05/08 Javascript
深入理解Python装饰器
2016/07/27 Python
python 出现SyntaxError: non-keyword arg after keyword arg错误解决办法
2017/02/14 Python
python中实现k-means聚类算法详解
2017/11/11 Python
Python+tkinter使用80行代码实现一个计算器实例
2018/01/16 Python
python模块导入的细节详解
2018/12/10 Python
在python中使用xlrd获取合并单元格的方法
2018/12/26 Python
如何在Django配置文件里配置session链接
2019/08/06 Python
win7下 python3.6 安装opencv 和 opencv-contrib-python解决 cv2.xfeatures2d.SIFT_create() 的问题
2019/10/24 Python
Python获取、格式化当前时间日期的方法
2020/02/10 Python
基于python实现数组格式参数加密计算
2020/04/21 Python
Python super()函数使用及多重继承
2020/05/06 Python
基于html5绘制圆形多角图案
2016/04/21 HTML / CSS
班级活动策划书
2014/02/06 职场文书
寄语是什么意思
2014/04/10 职场文书
股份转让协议书
2014/04/12 职场文书
5s推行计划书
2014/05/06 职场文书
优秀乡村医生先进事迹材料
2014/08/23 职场文书
室内趣味活动方案
2014/08/24 职场文书
毕业生实习期转正自我鉴定
2014/09/26 职场文书
华山导游词
2015/02/03 职场文书
老人与海读书笔记
2015/06/26 职场文书
幼儿园2016年感恩节活动总结
2016/04/01 职场文书
Python实现科学占卜 让视频自动打码
2022/04/09 Python
Python中的 enumerate和zip详情
2022/05/30 Python