JSON

简单值

"Hello world!"

javascript字符串与JSON字符串的最大区别在于,JSON字符串必须使用双引号(单引号会导致语法错误).

 

JSON对象

1、js对象与json对象的区别
对象字面量

var person = {
    name:'Lucy',
    age;29
};

var person = {
    name:'Lucy',
    age;29
};

JSON

{
    "name":"Lucy",
    "age":29
}

与JS的对象字面量相比,JSON对象有三个地方不一样
1)、没有声明变量(JSON中没有变量的概念)
2)、没有末尾的分号(因为这不是JavaScript语句,所以不需要分号)
3)、JSON对象的属性名任何时候都必须加双引号,忘了加双引号是常见都错误,这在JSON中是必需的,属性的值可以是简单值,也可以是复杂类型(对象等)

 

2、json对象有两个方法
stringify():把js对象序列化为json字符串
parse():json字符串解析为原生的js值。

sringify()

var book = {
    title:'professional javascript',
    authors:['Nicholas'],
    edition:3,
    year:2011
}
var jsonText = JSON.stringify(book); //{"title":"professional javascript","authors":["Nicholas"],"edition":3,"year":2011}

把js对象序列化成一个json字符串,然后保存再jsonText中。默认情况下
1)、JSON.stringify()输出的JSON字符串不包含任何空格字符和缩进
2)、在序列化js对象时,所有函数及原型都会被有意忽略
3)、值为undefined的任何属性也都会被跳过。

var bookCopy = JSON.parse(jsonText);//{ title:"professional javascript",authors:['Nicholas'],edition:3,year:2011}

虽然bookCopy与book具有相同都属性,但它们是两个独立的,没有任何关系的对象

 

3、stringify()还可以接收第二个参数作为过滤器
第二个参数以数组点形式传入

var book = {
    title:'professional javascript',
    authors:['Nicholas'],
    edition:3,
    year:2011
}
var jsonText = JSON.stringify(book,['title','edition']);
console.log(jsonText); //{"title":"professional javascript","edition":3}

想改变value值,可以以函数的方式传入

var book = {
    title:'professional javascript',
    authors:['Nicholas'],
    edition:3,
    year:2011
}
var jsonText = JSON.stringify(book,function(key,value){
    switch(key){
        case "authors":
            return value.join(",");
        case "year":
            return 5000;
        case "edition":
            return undefined;
        default:
            return value;
    }
});
console.log(jsonText);//{"title":"professional javascript","authors":"Nicholas","year":5000}

其中键为edition,通过返回undefined删除改属性,返回undefined意味着要跳过某个属性

 

4、stringify()第三个参数表示缩进
第三个参数如果是数字

var book = {
    title:'professional javascript',
    authors:['Nicholas'],
    edition:3,
    year:2011
}
var jsonText = JSON.stringify(book,['title','edition'], 4);
console.log(jsonText);
/*
{
"title": "professional javascript",
"edition": 3
}
*/

第三个参数是4,表示每个级别缩进4个空格,只要传入有效的控制缩进的参数值,结果字符串就会包含换行符。(只缩进而不换行意义不大)。最大缩进空格数为10,
所有大于10的值都会自动转换为10.
缩进参数是字符串

var book = {
    title:'professional javascript',
    authors:['Nicholas'],
    edition:3,
    year:2011
}
var jsonText = JSON.stringify(book,['title','edition'], '--');
console.log(jsonText);
/*
{
--"title": "professional javascript",
--"edition": 3
}
*/

同样,缩进字符串最长不能超过10个字符长。如果长度超过10个,结果将只出现前10个字符。

 

5、toJSON()方法
stringify()还是不能满足对某些对象进行自定义序列化对需求。在这些情况下,可以给对象定义toJSON()方法

var book = {
    title:'professional javascript',
    authors:['Nicholas'],
    edition:3,
    year:2011,
    toJSON:function(){
        return this.title;
    }
}
var jsonText = JSON.stringify(book);
console.log(jsonText);//"professional javascript"

toJSON可以作为函数过滤器的补充,因此理解序列化的内部顺序十分重要
1)如果存在toJSON()方法而且能通过它取得有效的值,则调用该方法。否则,返回对象本身。
2)如果提供了第二个参数,应用这个函数过滤器。传入函数过滤器的值是第1步返回的值(意思就是第二个参数无效)
3)对第2步返回的每个值进行相应的序列化
4)如果提供第三个参数,执行相应的格式化

 

6、JSON.parse()方法也可以接收另一个函数,区别stringify()的替换函数(replacer),这个函数被称为还原函数

var book = {
    title:'professional javascript',
    authors:['Nicholas'],
    edition:3,
    year:2011,
    releaseDate:new Date(2011,11,1)
}
var jsonText = JSON.stringify(book);
var bookCopy = JSON.parse(jsonText,function(key,value){
    if(key == 'releaseDate'){
        return new Date(value);
    }else{
        return value
    }
})
console.log(bookCopy);

 

JSON数组
数组字面量

var values = [25,'hi',true];

JSON数组

[25,"hi",true]

同样,js数组和json数组的区别
1)、没有声明变量(JSON中没有变量的概念)
2)、没有末尾的分号(因为这不是JavaScript语句,所以不需要分号)

posted @ 2018-03-01 07:04  wzndkj  阅读(148)  评论(0编辑  收藏  举报