JSON是一种数据格式,并不从属于javascript。并不是只有javascript才能使用JSON,很多编程语言都有针对JSON的解析器和序列化器。

 JSON的三种类型:

1)简单值:可以在JSON中表示字符串、数值、布尔值和null。但JSON不支持Javascript中的特殊值undefined。

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

2)对象:表示的是一组无序的键值对;

javascript中的对象字面量:

var person={
    name:"coco",
    age:23
};
//也可以给属性加引号
var object={
    "name":"coco",
    "age":23
};

 JSON表示上述对象的方式:

{
    "name":"coco",
    "age":23
}

 JSON对象是具有JSON格式规范的JS对象;

与对象字面量的区别:

①没有声明变量(JSON中没有变量的概念)

②没有末尾的分号;(因为不是javascript语句,所以不需要分号)

3)数组:有序的值的列表,可以通过数值索引访问其中的值;

JSON不支持变量、函数、或对象实例;

JSON数组采用的是JS的数组字面量形式,但是没有变量也没有分号结尾;

[
  {
    name:"coco",
    age:23
 },
 {
    "name":"coco",
    "age":23
 }
]


 解析与序列化

1)stringify():把Javascript对象序列化为JSON字符串;

JSON.stringify()输出的JSON字符串不包含任何空格字符或缩进;

在序列化对象时,所有的函数及原型成员都会被忽略,不体现在结果中。

值为undefined的任何属性也都会被跳过;

2)parse():把JSON字符串解析为原生的javascript值;

JSON字符串等价于JSON对象加上双引号;

原生的javascript值等价于JSON格式的JS对象;

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

var bookCopy=JSON.parse(jsonText);

 注意:虽然book 和bookCopy具有相同的属性,但它们是两个独立的,没有任何关系的对象;

JSON.stringify(对象,过滤器,选项)

第一个参数可是数组,也可以是函数;

第二个参数表示是否在JSON字符串中保留缩进;

单独或组合使用这两个参数都行;

var  JSONText=JSON.stringify(book,["title","edition"]);

 返回结果就只会是包含这两个属性:(过滤掉其他属性了)

var JSONText=JSON.stringify(book,function(key,value){
    switch(key){
        case "author":
        return value.join(",");
        case "year":
        return 5000;
        case "edition":
        return undefined;
        default:
        return value;
   }
});

函数根据传入的属性名和属性值可以知道应该如何处理序列化的对象中的属性。

如果函数返回了undefined,那么相应的属性会被忽略;

var JSONText=JSON.stringify(book,null,4);   //JSON中每一行缩进四个字符

如果缩进参数是一个字符串而非数值,则这个字符串将在JSON字符串中被用作缩进字符;

可以给对象定义toJSON()方法,返回其JSON数据格式。

可以给任何对象添加toJSON方法。

toJSON()可以作为函数过滤器的补充。

 把一个对象传入JSON.stringify(),序列化对象的顺序如下:

① 如果存在toJSON()方且能通过它取得有效的值,则调用该方法。否则,返回对象本身;

②如果提供了第二个参数,应用这个函数过滤器,传入函数过滤器的值,是第一步返回的值;

③对第二步返回的每个值进行相应的序列化。

④如果提供了第三个参数,执行相应的格式化

 JSON.parse()也可以接受另外一个参数是一个函数(还原函数);

将日期字符串转化为Date对象时,经常要用到还原函数;

var book={
     title:"professional javascript",
     author:["nichors"],
     edition:3,
     year:2011,
     releaseDate:new Date(2011,1,11)
};
var jsonText=JSON.stringify(book);

var bookCopy=JSON.parse(jsonText,function(key,value){
    if(key=="releaseDate"){
        return new Date(value);
    }else{
        return value;
    }
});

serialize()返回字符串,是一串URL编码的字符串:“a=2&b=3&c=5”

serializeArray()返回的是一个JSON对象数组;

PHP接收的是URL编码字符串