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 回车事件enter使用示例
Feb 18 Javascript
Document.location.href和.replace的区别示例介绍
Mar 04 Javascript
使用iojs的jsdom库实现同步系统时间
Apr 20 Javascript
第三章之Bootstrap 表格与按钮功能
Apr 25 Javascript
js调用父框架函数与弹窗调用父页面函数的简单方法
Nov 01 Javascript
js阻止移动端页面滚动的两种方法
Jan 25 Javascript
基于代数方程库Algebra.js解二元一次方程功能示例
Jun 09 Javascript
JavaScript之面向对象_动力节点Java学院整理
Jun 29 Javascript
tween.js缓动补间动画算法示例
Feb 13 Javascript
jQuery实现获取动态添加的标签对象示例
Jun 28 jQuery
详解在Vue.js编写更好的v-for循环的6种技巧
Apr 14 Javascript
详解vue3.0 diff算法的使用(超详细)
Jul 01 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
基于mysql的论坛(4)
2006/10/09 PHP
PHP面向对象学习笔记之一 基础概念
2012/10/06 PHP
那些年我们错过的魔术方法(Magic Methods)
2014/01/14 PHP
PHPExcel读取EXCEL中的图片并保存到本地的方法
2015/02/14 PHP
PHP开启目录引索+fancyindex漂亮目录浏览带搜索功能
2019/09/23 PHP
JavaScript实现维吉尼亚(Vigenere)密码算法实例
2013/11/22 Javascript
javascript对下拉列表框(select)的操作实例讲解
2013/11/29 Javascript
jQuery应用之jQuery链用法实例
2015/01/19 Javascript
浅谈javascript中的DOM方法
2015/07/16 Javascript
Three.js的使用及绘制基础3D图形详解
2017/04/27 Javascript
JavaWeb表单及时验证功能在输入后立即验证(含用户类型,性别,爱好...的验证)
2017/06/09 Javascript
vue中添加mp3音频文件的方法
2018/03/02 Javascript
React Native悬浮按钮组件的示例代码
2018/04/05 Javascript
微信小程序中的canvas 文字断行和省略号显示功能的处理方法
2018/11/14 Javascript
js实现窗口全屏示例详解
2019/09/17 Javascript
基于python的汉字转GBK码实现代码
2012/02/19 Python
用Python制作简单的钢琴程序的教程
2015/04/01 Python
python对配置文件.ini进行增删改查操作的方法示例
2017/07/28 Python
Python探索之自定义实现线程池
2017/10/27 Python
PyCharm 配置远程python解释器和在本地修改服务器代码
2019/07/23 Python
Python中itertools的用法详解
2020/02/07 Python
10款最佳Python开发工具推荐,每一款都是神器
2020/10/15 Python
Jupyter安装链接aconda实现过程图解
2020/11/02 Python
django中cookiecutter的使用教程
2020/12/03 Python
高校优秀辅导员事迹材料
2014/05/07 职场文书
银行先进个人事迹材料
2014/05/11 职场文书
生日宴会策划方案
2014/06/03 职场文书
材料专业大学毕业生自荐书
2014/07/02 职场文书
庆六一活动总结
2014/08/29 职场文书
求职简历自我评价怎么写
2015/03/10 职场文书
2015年小班保育员工作总结
2015/05/27 职场文书
2015年教学副校长工作总结
2015/07/22 职场文书
二胎满月酒致辞
2015/07/29 职场文书
公司环境卫生管理制度
2015/08/05 职场文书
Python Pycharm虚拟下百度飞浆PaddleX安装报错问题及处理方法(亲测100%有效)
2021/05/24 Python
win11电脑关机鼠标灯还亮怎么解决? win11关机后鼠标灯还亮解决方法
2023/01/09 数码科技