JSON.stringify(obj,[] / function,' ');
注解:1.仅当第一个参数为对象时,第二参数才有效。2.[]内值为对象的key(属性名或键)。
每个JSON对象,就是一个值。要么是简单类型的值,要么是复合类型的值。
- 复合类型的值只能是数组或对象.
-
简单类型的值只有四种:字符串、数值(十进制表示)、布尔值和
null。
-
字符串必须使用双引号表示,不能使用单引号。
-
对象的键名必须放在双引号里面。
-
数组或对象最后一个成员的后面,不能加逗号。
JSON.stringify
说明:将一个值转为字符串
1
2
3
4
|
JSON.stringify(1)
// "1"
JSON.stringify(
false
)
// "false"
JSON.stringify([])
// "[]"
JSON.stringify({})
// "{}"
|
第二参数:
JSON.stringify方法还可以接受一个数组,作为第二个参数,指定需要转成字符串的属性。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
例1:属性
var
obj = {
'prop1'
:
'value1'
,
'prop2'
:
'value2'
,
'prop3'
:
'value3'
};
var
selectedProperties = [
'prop1'
,
'prop2'
];
JSON.stringify(obj, selectedProperties)
// "{"prop1":"value1","prop2":"value2"}"
例2:只对对象的属性有效,对数组无效。
JSON.stringify([
'a'
,
'b'
], [
'0'
])
// "["a","b"]"
JSON.stringify({0:
'a'
, 1:
'b'
}, [
'0'
])
// "{"0":"a"}"
例3:第二个参数还可以是一个函数,用来更改JSON.stringify的默认行为。
function
f(key, value) {
if
(
typeof
value ===
"number"
) {
value = 2 * value;
}
return
value;
}
JSON.stringify({ a: 1, b: 2 }, f)
// '{"a": 2,"b": 4}'
/*f函数,接受两个参数,分别是被转换的对象的键名和键值。*/
|
第三参数:
说明:用于增加返回的JSON字符串的可读性。如果是数字,每个属性前面添加的空格不超过10个;如果是字符串(不超过10个);该字符串会添加在每行前面。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
JSON.stringify({ p1: 1, p2: 2 },
null
, 2);
/*
"{
"p1": 1,
"p2": 2
}"
*/
JSON.stringify({ p1:1, p2:2 },
null
,
'|-'
);
/*
"{
|-"p1": 1,
|-"p2": 2
}"
*/
|
toJSON 方法
如果对象有自定义的toJSON
方法,那么JSON.stringify
会使用这个方法的返回值作为参数,而忽略原对象的其他属性。
1
2
3
4
5
6
7
8
9
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
|
例一:
var
user = {
firstName:
'三'
,
lastName:
'张'
,
get fullName(){
return
this
.lastName +
this
.firstName;
},
toJSON:
function
() {
var
data = {
firstName:
this
.firstName,
lastName:
this
.lastName
};
return
data;
}
};
JSON.stringify(user)
// "{"firstName":"三","lastName":"张"}"
例二:JSON.stringify一旦发现处理的是data对象实例,就会自动调用这个实例对象的toJSON方法,将该方法的返回值作为参数。
var
date =
new
Date(
'2015-01-01'
);
date.toJSON()
// "2015-01-01T00:00:00.000Z"
JSON.stringify(date)
// ""2015-01-01T00:00:00.000Z""
例三:将正则对象自动转为字符串。设置了toJSON方法以后,就可以转换正则对象了。
var
obj = {
reg: /foo/
};
// 不设置 toJSON 方法时
JSON.stringify(obj)
// "{"reg":{}}"
// 设置 toJSON 方法时
RegExp.prototype.toJSON = RegExp.prototype.toString;
JSON.stringify(/foo/)
// ""/foo/""
|
JSON.parse方法用于将JSON字符串转化成对象。
1
2
3
4
5
|
JSON.parse(
'{}'
)
// {}
JSON.parse(
'true'
)
// true
JSON.parse(
'"foo"'
)
// "foo"
JSON.parse(
'[1, 5, "false"]'
)
// [1, 5, "false"]
JSON.parse(
'null'
)
// null
|
JSON.parse方法可以接受一个处理函数
1
2
3
4
5
6
7
8
9
10
11
12
|
function
f(key, value) {
if
(key ===
''
){
return
value;
}
if
(key ===
'a'
) {
return
value + 10;
}
}
var
o = JSON.parse(
'{"a":1,"b":2}'
, f);
o.a
// 11
o.b
// undefined
|
↑↑看不懂
https://www.w3cschool.cn/javascript_guide/javascript_guide-l1232690.html
JSON是JavaScript Object Notation的缩写,它是一种数据交换格式。
在JSON出现之前,大家一直用XML来传递数据。因为XML是一种纯文本格式,所以它适合在网络上交换数据。XML本身不算复杂,但是,加上DTD、XSD、XPath、XSLT等一大堆复杂的规范以后,任何正常的软件开发人员碰到XML都会感觉头大了,最后大家发现,即使你努力钻研几个月,也未必搞得清楚XML的规范。
终于,在2002年的一天,道格拉斯·克罗克福特(Douglas Crockford)同学为了拯救深陷水深火热同时又被某几个巨型软件企业长期愚弄的软件工程师,发明了JSON这种超轻量级的数据交换格式。
道格拉斯同学长期担任雅虎的高级架构师,自然钟情于JavaScript。他设计的JSON实际上是JavaScript的一个子集。在JSON中,一共就这么几种数据类型:
- number:和JavaScript的
number
完全一致; - boolean:就是JavaScript的
true
或false
; - string:就是JavaScript的
string
; - null:就是JavaScript的
null
; - array:就是JavaScript的
Array
表示方式——[]
; - object:就是JavaScript的
{ ... }
表示方式。
以及上面的任意组合。
并且,JSON还定死了字符集必须是UTF-8,表示多语言就没有问题了。为了统一解析,JSON的字符串规定必须用双引号""
,Object的键也必须用双引号""
。
由于JSON非常简单,很快就风靡Web世界,并且成为ECMA标准。几乎所有编程语言都有解析JSON的库,而在JavaScript中,我们可以直接使用JSON,因为JavaScript内置了JSON的解析。
把任何JavaScript对象变成JSON,就是把这个对象序列化成一个JSON格式的字符串,这样才能够通过网络传递给其他计算机。
如果我们收到一个JSON格式的字符串,只需要把它反序列化成一个JavaScript对象,就可以在JavaScript中直接使用这个对象了。
序列化
让我们先把小明这个对象序列化成JSON格式的字符串:
'use strict'; var xiaoming = { name: '小明', age: 14, gender: true, height: 1.65, grade: null, 'middle-school': '\"W3C\" Middle School', skills: ['JavaScript', 'Java', 'Python', 'Lisp'] };var s = JSON.stringify(xiaoming); console.log(s); Run
要输出得好看一些,可以加上参数,按缩进输出:
JSON.stringify(xiaoming, null, ' ');
结果:
{
"name": "小明",
"age": 14, "gender": true, "height": 1.65, "grade": null, "middle-school": "\"W3C\" Middle School", "skills": [ "JavaScript", "Java", "Python", "Lisp" ] }
第二个参数用于控制如何筛选对象的键值,如果我们只想输出指定的属性,可以传入Array
:
JSON.stringify(xiaoming, ['name', 'skills'], ' ');
结果:
{
"name": "小明",
"skills": [ "JavaScript", "Java", "Python", "Lisp" ] }
还可以传入一个函数,这样对象的每个键值对都会被函数先处理:
function convert(key, value) {
if (typeof value === 'string') { return value.toUpperCase(); } return value; } JSON.stringify(xiaoming, convert, ' ');
上面的代码把所有属性值都变成大写:
{
"name": "小明",
"age": 14, "gender": true, "height": 1.65, "grade": null, "middle-school": "\"W3C\" MIDDLE SCHOOL", "skills": [ "JAVASCRIPT", "JAVA", "PYTHON", "LISP" ] }
如果我们还想要精确控制如何序列化小明,可以给xiaoming
定义一个toJSON()
的方法,直接返回JSON应该序列化的数据:
var xiaoming = {
name: '小明',
age: 14,
gender: true,
height: 1.65, grade: null, 'middle-school': '\"W3C\" Middle School', skills: ['JavaScript', 'Java', 'Python', 'Lisp'], toJSON: function () { return { // 只输出name和age,并且改变了key: 'Name': this.name, 'Age': this.age }; } }; JSON.stringify(xiaoming); // '{"Name":"小明","Age":14}'
反序列化
拿到一个JSON格式的字符串,我们直接用JSON.parse()
把它变成一个JavaScript对象:
JSON.parse('[1,2,3,true]'); // [1, 2, 3, true] JSON.parse('{"name":"小明","age":14}'); // Object {name: '小明', age: 14} JSON.parse('true'); // true JSON.parse('123.45'); // 123.45
JSON.parse()
还可以接收一个函数,用来转换解析出的属性:
'use strict';var obj = JSON.parse('{"name":"小明","age":14}', function (key, value) { if (key === 'name') { return value + '同学'; } return value; }); console.log(JSON.stringify(obj)); // {name: '小明同学', age: 14} Run
在JavaScript中使用JSON,就是这么简单!
https://www.liaoxuefeng.com/wiki/001434446689867b27157e896e74d51a89c25cc8b43bdb3000/001434499490767fe5a0e31e17e44b69dcd1196f7ec6fc6000