什么是JSON?
JSON它是一种数据格式,而不是一门编程语言,它利用了JavaScript中的一些模式来表示结构化数据,虽然看上去JSON和JavaScript具有相同的语法形式,但JSON并不属于JavaScript,而且诸多的语言都可以用JSON因为它只是一种数据格式,在JSON出现之前很长一段时间都以XML作为互联网上传输结构化数据的标准,之前的web服务器与服务器之间通信都是建立在XML之上的,然而不少人认为XML不易读而且过于繁琐、多余。还好在2006年Douglas Crockford将JSON作为一个标准提交给IETF,虽然在之前的2001年就已经开始使用,但在2006年后才慢慢被大家所喜欢。
一、JSON语法
JSON可以表示为以下三种类型值
- 简单值
可用JavaScript语法表示JSON,如字符串、数值、布尔值、null但不支持特殊的undefined。
5
“helloworld”
- 对象
对象作为复杂的数据类型,用一组无序的键值对来表示出复杂的JSON数据。
var object = {
"name":"sanyeyu",
"age":22,
"work":"web全栈"
};
- 数组
数组也是复杂的数据类型,它用一组有序的值来表示出复杂的JSON数据,它可以通过下标来访问其中的值。
[
{
"name":"sanyeyu",
"age":"22",
"aothing":[13,"hhj"],
"fx":"fg"
},
{
"name":"sanyeyu"",
"age":"22",
"aothing":[13,"hhj"],
"fx":"fg"
}];
二、JSON对象
- 早期的JSON解析基本上都是用的JavaScript的
eval()
函数,因为JSON是JavaScript的子集,所以eval()
可以解析并返回JavaScript的对象和数组,但由于eval()
对JSON数据结构求值存在风险,可能会执行一些恶意代码,对于不能原生支持JSON解析的浏览器,使用shim是最佳选择。
- JOSN对象有两个方法
stringify()
和parse()
。
stringify()
把JavaScript对象系列化为JSON字符串以便处理。
var object = {
"name":"sanyeyu",
"age":"22",
"aothing":[13,"hhj"],
"fx":"fg"
};
var jsontext = JSON.stringify(object,null);
console.log(jsontext);
//{"name":"sanyeyu","age":"22","aothing":[13,"hhj"],"fx":"fg"}
parse()
把JSON字符串解析为原生JavaScript值。
var hh = JSON.parse(jsontext,null);
console.log(hh);
//{name: "sanyeyu", age: "22", aothing: Array(2), fx: "fg"}age: "22"aothing: (2) [13, "hhj"]fx: "fg"name: "sanyeyu"__proto__: Object
三、解析与序列化选项
- 过滤结果
stringify()
方法的第二个参数是一个数组表示要过滤的属性。
const object = {
"name":"sanyeyu",
"age":"22",
"aothing":[13,"hhj"],
"fx":"fg"
};
const jsontext = JSON.stringify(object,["aothing"]);
console.log(jsontext);
//{"aothing":[13,"hhj"]}
- 字符串缩进
stringify()
方法的第三个参数表示要缩进几个字符串,也可以填写其他符号,但缩进字符串不能超过10个字符串。
1、添加数组
const object = {
"name":"sanyeyu",
"age":"22",
"aothing":[13,"hhj"],
"fx":"fg"
};
const jsontext = JSON.stringify(object,null,4);
console.log(jsontext);
//输出
{
"name": "sanyeyu",
"age": "22",
"aothing": [
13,
"hhj"
],
"fx": "fg"
}
2.添加其他符号
const object = {
"name":"sanyeyu",
"age":"22",
"aothing":[13,"hhj"],
"fx":"fg"
};
const jsontext = JSON.stringify(object,null,“[]”);
console.log(jsontext);
//输出
{
[]"name": "sanyeyu",
[]"age": "22",
[]"aothing": [
[][]13,
[][]"hhj"
[]],
[]"fx": "fg"
}
四、toJSON()方法
- 有时候
JSON.stringify()
还是不能满足某些对象进行自定义序列化的需求,所以在某些特殊情况下可以给对象定义toJSON()
方法,返回其自身的JSON数据格式。
const object = {
"name":"sanyeyu",
"age":"22",
"aothing":[13,"hhj"],
"fx":"fg",
toJSON: function(){
return this.aothing;
}
};
const jsontext = JSON.stringify(object,null,2);
console.log(jsontext);
//输出
[
13,
"hhj"
]
JSON.parse()
方法也可以接收另一个参数,该参数是一个函数,将在每个键值对上调用,为了区别于JSON.stringify()
接收的过滤函数,它被称为还原函数,但它们都基本上是相同的,都接收两个参数,键和值而且都需要返回一个值.
如果还原函数返回undefined,则表示要从结果中删除相应的键,如果返回其他值,则将该值插入到结果中去,一般在将日期转换为Date对象时,经常要用到还原函数。
const object = {
"name":"sanyeyu",
"age":"22",
"aothing":[13,"hhj"],
"fx":"fg",
year:2017,
redate: new Date(2017, 10, 1),
// toJSON: function(){
// return this.age;
// }
};
const jsonText = JSON.stringify(object,null,3);
console.log(jsonText);
const obbook = JSON.parse(jsonText, function(key, value){
if(key == "redate"){
return new Date(value);
}else{
return value;
}
})
console.log(obbook);
//输出
{
"name": "sanyeyu",
"age": "22",
"aothing": [
13,
"hhj"
],
"fx": "fg",
"year": 2017,
"redate": "2017-10-31T16:00:00.000Z"
}