Json简介
JSON:JavaScript 对象表示法(JavaScript Object Notation)。
JSON 是存储和交换文本信息的语法。类似 XML。
JSON 比 XML 更小、更快,更易解析。
JSON 文本格式在语法上与创建 JavaScript 对象的代码相同。
Json语法
JSON 语法是 JavaScript 对象表示语法的子集。
- 数据在名称/值对中
- 数据由逗号分隔
- 大括号保存对象
- 中括号保存数组
JSON 值
- 数字(整数或浮点数)
- 字符串(在双引号中)
- 逻辑值(true 或 false)
- 数组(在中括号中)
- 对象(在大括号中)
- null
例如:
对象:
{
"name": "Jack",
"age": 26,
"sex": "男",
"students": [{
"name": "jam",
"age": 16,
"sex": "男"
},
{
"name": "lucy",
"age": 16,
"sex": "女"
}
]
}
- Json的key必须是字符串,value可以是Json允许的任意类型。
- key和value之间用冒号隔开。
- 键值对之间用逗号隔开。
JSON 文件
- JSON 文件的文件类型是 “.json”
- JSON 文本的 MIME 类型是 “application/json”
JSON的使用
JSON 最常见的用法之一,是从 web 服务器上读取 JSON 数据(作为文件或作为 HttpRequest),将 JSON 数据转换为 JavaScript 对象,然后在网页中使用该数据。
JSON.parse()
JSON.parse() 方法把JSON文本转换为JavaScript 对象。
语法
JSON.parse(text[, reviver])
参数
- text:必需。一个有效的 JSON 字符串。
- reviver:可选。规定了原始值在被返回之前如何被解析改造,将为对象的每个成员调用此函数。 如果成员包含嵌套对象,则先于父对象转换嵌套对象。 更具体点讲就是:解析值本身以及它所包含的所有属性,会按照一定的顺序(从最最里层的属性开始,一级级往外,最终到达顶层,也就是解析值本身)分别的去调用 reviver 函数,在调用过程中,当前属性所属的对象会作为 this 值,当前属性名和属性值会分别作为第一个和第二个参数传入 reviver 中。如果 reviver 返回 undefined,则当前属性会从所属对象中删除,如果返回了其他值,则返回的值会成为当前属性新的属性值。
例如:
<script>
var str = '{"peoples":[{"name":"lucy","sex":1},{"name":"jams","sex":0}]}';
var obj = JSON.parse(str, function(key, value){
if(key === 'sex') {
return value == 1 ? '女' : '男';
} else {
return value;
}
});
console.info(obj);
var obj = JSON.parse(str, function(key, value){
console.log(key); // 输出当前的属性名,从而得知遍历顺序是从内向外的,最后一个属性名会是个空字符串。
return value;
});
</script>
提示:
可以使用内建的eval()函数来生成JavaScript对象。例如:
var str = '{"peoples":[{"name":"lucy","sex":1},{"name":"jams","sex":0}]}';
var obj = eval("(" + str + ")");//必须把JSON字符串包含在括号中
console.info(obj);
但是eval() 函数会编译并执行任何 JavaScript 代码。这隐藏了一个潜在的安全问题。
使用 JSON 解析器将 JSON 转换为 JavaScript 对象是更安全的做法。JSON 解析器只能识别 JSON 文本,而不会编译脚本。
在浏览器中,这提供了原生的 JSON 支持,而且 JSON 解析器的速度更快。
JSON.stringify()
JSON.stringify() 方法将 JavaScript 对象转换为字符串。
语法
JSON.stringify(value[, replacer [, space]])
参数
- value:必需, 一个有效的 JSON 对象。
- replacer:可选。用于转换结果的函数或数组。如果 replacer 为函数,则 JSON.stringify 将调用该函数,并传入每个成员的键和值。使用返回值而不是原始值。如果此函数返回 undefined,则排除成员。根对象的键是一个空字符串。如果 replacer 是一个数组,则仅转换该数组中具有键值的成员。成员的转换顺序与键在数组中的顺序一样。当 value 参数也为数组时,将忽略 replacer 数组。
- space:可选,文本添加缩进、空格和换行符,如果 space 是一个数字,则返回值文本在每个级别缩进指定数目的空格,如果 space 大于 10,则文本缩进 10 个空格。如果该参数为字符串(字符串的前十个字母),该字符串将被作为空格;
示例:
当replacer为数组时:
var str = '{"peoples":[{"name":"lucy","sex":1},{"name":"jams","sex":0}]}';
var obj = eval("(" + str + ")");
var newStr = JSON.stringify(obj,["peoples","name"]);
console.info(newStr);
结果:
{"peoples":[{"name":"lucy"},{"name":"jams"}]}
当replacer为函数时:
var str = '{"peoples":[{"name":"lucy","sex":1},{"name":"jams","sex":0}]}';
var obj = eval("(" + str + ")");
var newStr = JSON.stringify(obj,function(key, value){
if(key === 'sex') {
return value == 1 ? '女' : '男';
} else {
return value;
}
});
console.info(newStr);
结果:
{"peoples":[{"name":"lucy","sex":"女"},{"name":"jams","sex":"男"}]}
使用space美化JSON字符串:
var str = '{"peoples":[{"name":"lucy","sex":1},{"name":"jams","sex":0}]}';
var obj = eval("(" + str + ")");
var newStr = JSON.stringify(obj,"","\t");
console.info(newStr);
结果:
{
"peoples": [
{
"name": "lucy",
"sex": 1
},
{
"name": "jams",
"sex": 0
}
]
}
JSON.stringify() 方法在使用replacer参数时,是从最外层开始遍历属性的。
var str = '{"peoples":[{"name":"lucy","sex":1},{"name":"jams","sex":0}]}';
var obj = eval("(" + str + ")");
var newStr = JSON.stringify(obj,function(key, value){
console.info(key);
return value;
},"\t");
如果replacer函数返回undefined,该属性值不会在JSON字符串中输出。
var str = '{"peoples":[{"name":"lucy","sex":1},{"name":"jams","sex":0}]}';
var obj = eval("(" + str + ")");
var newStr = JSON.stringify(obj,function(key, value){
if(key === 'sex') {
return undefined;
} else {
return value;
}
},"\t");
console.info(newStr);
结果:
{
"peoples": [
{
"name": "lucy"
},
{
"name": "jams"
}
]
}