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的Tooltip插件 qtip使用详细说明
Sep 08 Javascript
jQuery中调用WebService方法小结
Mar 28 Javascript
js二级地域选择的实现方法
Jun 17 Javascript
js函数返回多个返回值的示例代码
Nov 05 Javascript
JQuery Tips相关(1)----关于$.Ready()
Aug 14 Javascript
jquery设置表单元素为不可用的简单代码
Jul 04 Javascript
JS实现iframe自适应高度的方法示例
Jan 07 Javascript
你真的了解BOM中的history对象吗
Feb 13 Javascript
js编写简单的聊天室功能
Aug 17 Javascript
vue使用axios跨域请求数据问题详解
Oct 18 Javascript
js使用swiper实现层叠轮播效果实例代码
Dec 12 Javascript
微信公众平台 客服接口发消息的实现代码(Java接口开发)
Apr 17 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
简单采集了yahoo的一些数据
2007/02/14 PHP
php使用base64加密解密图片示例分享
2014/01/20 PHP
PHP手机号中间四位用星号*代替显示的实例
2017/06/02 PHP
javascript FormatNumber函数实现方法
2008/12/30 Javascript
使用javascript过滤html的字符串(注释标记法)
2013/07/08 Javascript
JavaScript 命名空间 使用介绍
2013/08/29 Javascript
input:checkbox多选框实现单选效果跟radio一样
2014/06/16 Javascript
jQuery实现的简单提示信息插件
2015/12/08 Javascript
JavaScript数据绑定实现一个简单的 MVVM 库
2016/04/08 Javascript
基于JS快速实现导航下拉菜单动画效果附源码下载
2016/10/27 Javascript
js实现简单的计算器功能
2017/01/16 Javascript
jQuery插件FusionCharts绘制的3D环饼图效果示例【附demo源码】
2017/04/02 jQuery
JS正则验证多个邮箱完整实例【邮箱用分号隔开】
2017/04/19 Javascript
js图片轮播插件的封装
2017/07/21 Javascript
JavaScript中的FileReader图片预览上传功能实现代码
2017/07/24 Javascript
vue-cli3项目展示本地Markdown文件的方法
2019/06/07 Javascript
在js文件中引入(调用)另一个js文件的三种方法
2020/09/11 Javascript
python实现提取百度搜索结果的方法
2015/05/19 Python
python中解析json格式文件的方法示例
2017/05/03 Python
Python通过Pygame绘制移动的矩形实例代码
2018/01/03 Python
numpy中的delete删除数组整行和整列的实例
2018/05/09 Python
Python中的TCP socket写法示例
2018/05/11 Python
Python爬虫框架scrapy实现downloader_middleware设置proxy代理功能示例
2018/08/04 Python
解决pyinstaller打包exe文件出现命令窗口一闪而过的问题
2018/10/31 Python
Python自省及反射原理实例详解
2020/07/06 Python
python3 kubernetes api的使用示例
2021/01/12 Python
HTML5地理定位与第三方工具百度地图的应用
2016/11/17 HTML / CSS
美国最大的万圣节服装网站:HalloweenCostumes.com
2017/10/12 全球购物
十佳教师事迹材料
2014/01/11 职场文书
高三毕业寄语
2014/04/10 职场文书
电钳工人个人求职信
2014/05/10 职场文书
个人自我剖析材料
2014/09/30 职场文书
交通安全学习心得体会
2016/01/18 职场文书
2016年社区创先争优活动总结
2016/04/05 职场文书
2016年少先队活动总结
2016/04/06 职场文书
《月歌。》宣布制作10周年纪念剧场版《RABBITS KINGDOM THE MOVIE》
2022/04/02 日漫