JSON解析与序列化

# JSON是一种不仅限于JavaScript的数据格式

JSON语法:

JSON语法可以表示一下三种类型的值。

  简单值:字符串、数值、布尔值、null,不支持undefined。

    JSON格式:1、"hello"

  对象:值可以是简单值或复杂的对象值。

    JSON格式:  

{
   "name": "Rose",
    "age": 25
}
//和对象字面量形式不同的是:JSON对象没有声明变量、属性名必须加“”(双引号)且末尾没有分号

  数组:值可以是任意类型。

    JSON格式:

[
  {
  "name":"student1",
  "age": 11
  },
  {
  "name":"student2",
  "age": 12
  }
]

JSON解析与序列化

1、JSONstringify()的使用 :过滤器、字符串缩进和toJSON()方法

2、解析JSON.parse()方法

 //定义一个对象
    var person = {
        name: "nikol",
        age: "26",
        gender: "male",
        city: "tokyo",
        girlFriend: undefined
    }

    /*
    * 1、对象转换成JSON字符串
    */
    var jsonText1 = JSON.stringify(person);
    // alert(jsonText1);//忽略值为undefined 的 girlFirend属性

    /*
    * 1.1、stringif()过滤器作用 (两个参数)
    *   例如:提取obj对象中的attr属性
    *   语法:JSON0stringif(obj, ["attr1", "attr2",...])
    *   第二个参数为一个字符串数组,它包含一个或多个对象属性字符串。
    */
    var jsonText11 = JSON.stringify(person, ["name", "age"]);
    // alert(jsonText11);//{"name":"nikol","age":"26"}
    //同样忽略值为undefined的属性
    var jsonText111 = JSON.stringify(person, ["name", "age","girlFirend"]);
    // alert(jsonText111);

    /*
    * (自定义过滤)自定义对象序列化后的值(两个参数)
    * 例如:改变name和age属性的值分别为 "jso"和"undefined"
    * 语法: JSON.stringify(obj, function (key, value) {
                switch (key) {
                    case "name":
                        return "jso";
                    case "age":
                        return "undefined";
                    default:
                        return value;
                }
            });
    */
    var jsonText112 = JSON.stringify(person, function (key, value) {
                    switch (key) {
                        case "name":
                            return "jso";
                        case "age":
                            return "undefined";
                        default:
                            return value;
                    }
                });
    // alert(jsonText112);//{"name":"jso","age":"undefined","gender":"male","city":"tokyo"}

    /*
    * 1.2、字符串缩进(三个参数)
    * 第二个参数为null,第三个参数代表缩进的空格数,或者字符串
    */
    //每级缩进4个空格(最大为10,超过10都自动转换为10)
    var jsonText12 = JSON.stringify(person,null,4);
    // alert(jsonText12);

    //以"--"代替缩进空格
    var jsonText121 = JSON.stringify(person,null,"--");
    // alert(jsonText121);

    /*
    * 1.3、toJson()方法
    * 内部调用顺序: 1 --> 2 --> 3
    *   (1)、有toJSON()调用toJSON()没有则返回对象本身
    *   (2)、如果是两个参数的过滤器,则先过滤后再应用(1) (过滤器接收的值是(1)的返回值),
    *       然后再对这个(1)的返回值进行序列
    *   (3)、如果提供三个参数,则按照三个参数来进行对应的序列化;
    */
    /*
    * 测试 toJSON()方法
    */
    var obj = {
        title: "this is a title ",
        paragraph: "this is paragraph ",
    }

    var obj1 = {
        title: "this is a title 1",
        paragraph: "this is paragraph 1",
        toJSON: function () {
            return this.title;
        }
    }
    
    //测试(1)
    var objJson = JSON.stringify(obj);
    var obj1Json = JSON.stringify(obj1);
    // alert(objJson); //{"title":"this is a title ","paragraph":"this is paragraph "} 返回对象本身
    // alert(obj1Json);//"this is a title 1"   优先调用toJSON()方法

    //测试(2) 过滤器  
    var objFilter = JSON.stringify(obj, ["paragraph"])
    // alert(objFilter);//{"paragraph":"this is paragraph "} 正常过滤

    var obj1Filter = JSON.stringify(obj1, ["paragraph"]);
    // alert(obj1Filter);//"this is a title 1" 调用toJSON()

    //测试(3)
    var obj3Filter = JSON.stringify(obj1, null, "--");
    var obj31Filter = JSON.stringify(obj1, null, 4);
    // alert(obj3Filter);//"this is a title 1"  调用toJSON()
    // alert(obj31Filter);//"this is a title 1"  调用toJSON()    

    /*
    * 1.3 解析 JSON.parse()
    */
    var objJstr = JSON.stringify(obj);

    var objJparse = JSON.parse(objJstr, function (key, value) {
        if (key == "title") {
            return "我准备改变title";
        } else {
            return value;
        }
    });
    // alert(objJparse);
    // alert(objJparse.title);
原文地址:https://www.cnblogs.com/suiucat/p/9750371.html