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中load方法的用法及注意事项说明
Feb 22 Javascript
js 动态修改css文件用到了cssRule
Aug 20 Javascript
将数字转换成大写的人民币表达式的js函数
Sep 21 Javascript
JS实现模拟风力的雪花飘落效果
May 13 Javascript
jquery模拟进度条实现方法
Aug 03 Javascript
js数组实现权重概率分配
Sep 12 Javascript
jQuery实现的简单动态添加、删除表格功能示例
Sep 21 jQuery
javascript基于定时器实现进度条功能实例
Oct 13 Javascript
详解vue 2.6 中 slot 的新用法
Jul 09 Javascript
微信小程序 自定义弹窗实现过程(附代码)
Dec 05 Javascript
解决Echarts 显示隐藏后宽度高度变小的问题
Jul 19 Javascript
vue 解决兄弟组件、跨组件深层次的通信操作
Jul 27 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 编写安全的代码时容易犯的错误小结
2010/05/20 PHP
ThinkPHP调用common/common.php函数提示错误function undefined的解决方法
2014/08/25 PHP
php中cookie实现二级域名可访问操作的方法
2014/11/11 PHP
JavaScript 核心参考教程 内置对象
2009/10/13 Javascript
jQuery实现的导航条切换可显示隐藏
2014/10/22 Javascript
Jquery实现仿腾讯娱乐频道焦点图(幻灯片)特效
2015/03/06 Javascript
JS轮播图中缓动函数的封装
2020/11/25 Javascript
Easyui和zTree两种方式分别实现树形下拉框
2017/08/04 Javascript
Node.js创建HTTP文件服务器的使用示例
2018/05/11 Javascript
微信小程序项目总结之点赞 删除列表 分享功能
2018/06/25 Javascript
详解React项目如何修改打包地址(编译输出文件地址)
2019/03/21 Javascript
ES6 Array常用扩展的应用实例分析
2019/06/26 Javascript
python实现将一个数组逆序输出的方法
2018/06/25 Python
Django中使用haystack+whoosh实现搜索功能
2019/10/08 Python
解决pycharm编辑区显示yaml文件层级结构遇中文乱码问题
2020/04/27 Python
HTML5语音识别标签写法附图
2013/11/18 HTML / CSS
HTML5 Canvas 实现圆形进度条并显示数字百分比效果示例
2017/08/18 HTML / CSS
canvas 基础之图像处理的使用
2020/04/10 HTML / CSS
DVF官方网站:美国时装界尊尚品牌
2017/08/29 全球购物
泰国第一的化妆品网站:Konvy
2018/02/25 全球购物
C#如何调用Word并打开一个Word文档
2013/05/08 面试题
AJAX的全称是什么
2012/11/06 面试题
接受捐赠答谢词
2014/01/27 职场文书
机电专业大学生职业规划书范文
2014/02/25 职场文书
2014年党务公开方案
2014/05/08 职场文书
公司户外活动总结
2014/07/04 职场文书
迎国庆演讲稿
2014/09/15 职场文书
2014年学生党支部工作总结
2014/12/20 职场文书
化验室岗位职责
2015/02/14 职场文书
合同纠纷调解书
2015/05/20 职场文书
行政答辩状范文
2015/05/21 职场文书
毕业酒会致辞
2015/07/29 职场文书
AI:如何训练机器学习的模型
2021/04/16 Python
基于JavaScript实现省市联动效果
2021/06/22 Javascript
Redis中一个String类型引发的惨案
2021/07/25 Redis
Python matplotlib可视化之绘制韦恩图
2022/02/24 Python