虽说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
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);
|