JavaScript中使用JSON

虽说JavaScript原生支持JSON,但真用到的时候,也遇到了一些麻烦。下面整理一些JSON相关的JS程序。

1. 将JSON字串解析为对象

最简单的方法是使用eval

1
2
3
var jsonStr = '{ "name": "幼学笔记", "url": "oncoding.cn" }' ; //定义一个json字符串
var jsonObj = eval( '(' + jsonStr + ')' ); //使用eval解析成对象
console.log(jsonObj);


但如果JSON字符串不严谨或被利用漏洞,eval会产生一些隐患,这是可以使用JSON解析器JSON.parse()进行解析

需要引入这个 json2.js 文件(必须下载到本地目录,去掉第一行,Crockford太小气了:)。

01
02
03
04
05
06
07
08
09
10
var jsonObj = JSON.parse(jsonStr, function (key, value) {
     var type;
     if (value && typeof value === 'object' ) {
         type = value.type;
         if ( typeof type === 'string' && typeof window[type] === 'function' ) {
             return new (window[type])(value);
         }
     }
     return value;
});

2. 将JS对象转换为JSON字串

这其实就是一个遍历对象,组装成字符串的过程。json2.js中也有对应的方法JSON.stringify,用法为:

1
2
3
var jsonStr= JSON.stringify(jsonObj , function (key, value) {
     return value;
});

3. jQuery

Fdream写的一个jQuery扩展可以实现以上两种操作。

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
/**
  * extension of JSON, type for jQuery
  * AUTHOR: xushengs@gmail.com
  * WEBSITE: http://ooboy.net/
  */
( function ($){
     // the code of this function is from
     $.type = function (o){
         var _toS = Object.prototype.toString;
         var _types = {
             'undefined' : 'undefined' ,
             'number' : 'number' ,
             'boolean' : 'boolean' ,
             'string' : 'string' ,
             '[object Function]' : 'function' ,
             '[object RegExp]' : 'regexp' ,
             '[object Array]' : 'array' ,
             '[object Date]' : 'date' ,
             '[object Error]' : 'error'
         };
         return _types[ typeof o] || _types[_toS.call(o)] || (o ? 'object' : 'null' );
     };
     // the code of these two functions is from mootools
     var $specialChars = {
         '\b' : '\\b' ,
         '\t' : '\\t' ,
         '\n' : '\\n' ,
         '\f' : '\\f' ,
         '\r' : '\\r' ,
         '"' : '\\"' ,
         '\\' : '\\\\'
     };
     var $replaceChars = function (chr){
         return $specialChars[chr] || '\\u00' + Math.floor(chr.charCodeAt() / 16).toString(16) + (chr.charCodeAt() % 16).toString(16);
     };
     $.toJSON = function (o){
         var s = [];
         switch ($.type(o)) {
             case 'undefined' :
                 return 'undefined' ;
                 break ;
             case 'null' :
                 return 'null' ;
                 break ;
             case 'number' :
             case 'boolean' :
             case 'date' :
             case 'function' :
                 return o.toString();
                 break ;
             case 'string' :
                 return '"' + o.replace(/[\x00-\x1f\\"]/g, $replaceChars) + '"' ;
                 break ;
             case 'array' :
                 for ( var i = 0, l = o.length; i < l; i++) {
                     s.push($.toJSON(o[i]));
                 }
                 return '[' + s.join( ',' ) + ']' ;
                 break ;
             case 'error' :
             case 'object' :
                 for ( var p in o) {
                     s.push( '\"' + p + '\"' + ':' + $.toJSON(o[p]));
                 }
                 return '{' + s.join( ',' ) + '}' ;
                 break ;
             default :
                 return '' ;
                 break ;
         }
     };
     $.evalJSON = function (s){
         if ($.type(s) != 'string' || !s.length)
             return null ;
         return eval( '(' + s + ')' );
     };
})(jQuery);

使用方法:

1
var jsonStr = $.toJSON(jsonData);
1
var jsonData= $.jsonStr(jsonStr);

4. JSON的汉字问题

以上方法生成的JSON字串中的汉字都是未经转义的。虽然一般不会影响正常使用,但因为涉及到不同语言之间的传输、存储,有时候还需要对汉字进行unicode编码。

JavaScriptunicode编码函数:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
function unicode(str){
     var a = [], i = 0;
     for (; i < str.length;) {
         var strr = str[i];
         if (check(strr)){
             a[i] = "\\u" +( "00" + str.charCodeAt(i).toString(16)).slice( - 4);
             //alert(a[i]);
         }
         else {
             a[i] = strr;
         }
         i++;
     }
     return (a.join( "" ));
}

用法:

1
jsonStr = unicode(jsonStr);

5. 参考资料


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值