Json解析

javascript中没有一种数据类型叫做"JSON对象".可以说JSON对象是在一种特殊环境上下文中产生的叫法,JSON在日常的表现形式更多的是一个拥有复杂数据结构的字符串, 只是可以被转换为对象,规范里也明确地说了JSON只是一个数据交换语言,只有我们将之用在string上下文的时候它才叫JSON。{ "prop": "val" } 这样的声明有可能是JavaScript对象字面量也有可能是JSON字符串,取决于什么上下文使用它,如果是用在string上下文(用单引号或双引号引住,或者从text文件读取)的话,那它就是JSON字符串,如果是用在对象字面量上下文中,那它就是对象字面量。


        // 这是JSON字符串
        var foo = '{ "prop": "val" }';

        // 这是对象字面量
        var bar = { "prop": "val" };
        console.log(bar.prop);     //val
             

而且要注意,JSON有非常严格的语法,在string上下文里{ "prop": "val" } 是个合法的JSON,但{ prop: "val" }和{ 'prop': 'val' }确实不合法的。所有属性名称和它的值都必须用双引号引住,不能使用单引号。另外,即便你用了转义以后的单引号也是不合法的

如下都是书写错误的


        { name: "张三", 'age': 32 }   // 属性名必须使用双引号
        [32, 64, 128, 0xFFF]   // 不能使用十六进制值
        { "name": "张三", age: undefined }    // 不能使用undefined
        { "name": "张三","birthday": new Date('Fri, 26 Aug 2011 07:13:10 GMT'),
          "getName": function() {
              return this.name;
          }
        }   // 不能使用函数和日期对象
             

如下规范


        var j1 = ["one", "two", "three"];
        var j2 = { "one": 1, "two": 2, "three": 3 };
        var j3 = { "names": ["张三", "李四"] };
        var j4 = [{ "name": "张三" }, { "name": "李四" }];
             

注意空数组和空对象都是符合规范的JSON值, null本身也没有问题

JSON不一定非要是{}或者[],而是两者均可

新增了JSON对象专门用来处理JSON格式,并且附加了stringify()parse()两个方法.


        var j5 = JSON.stringify("abc");
        // "abc"
        var j6 = JSON.stringify({ name: "张三" });
        // {"name":"张三"}

        console.log(j5);
             

这里转为的时候如果遇到一个值是undefined或者是函数, 那么该值会被省略, 除非这个值是数组的成员, 则返回null.

var j7 = JSON.stringify({ f: function () { }, a: [function () { }, undefined] }); // "{"a":[null,null]}"

第一个参数是要转换的对象, 第二个参数可以没有, 也可以是数组参数表示要转化的属性, 或者是一个函数用来更改默认的转换.


        var j8 = JSON.stringify({ a: 1, b: 2 }, ['a']);   // "{"a":1}"

        var j9 = JSON.stringify({ a: 1, b: 2 }, f)  // "{"a":2,"b":4}"

        function f(key, value) {
            if (typeof value === "number") {
                value = 2 * value;
            }
            return value;
        }
       
             

想要将一个字符串转换为JSON对象,那么传入的字符串一定要是有效的格式,否则程序会出错,为了防止意外可以将这个过程放到try/catch代码块中.

        
        function f(key, value) {
            if (key === "") {
                return value;
            }

            if (key === "a") {
                return value + 10;
            }

            if (key === "b") {
                return value + 10;
            }

        }

        var o = JSON.parse('{"a":1,"b":2}', f);  
        console.log(o.a);  //2  
             

        var obj = { 
                name: 'wangkai', 
                age: 22, address: 'henan', 
                say: function () { console.log('我的名字是' + this.name); }  
           }; 

        obj.say();
            

缺点是 没法复用,所以更适合用于只一个对象的.层级关系,类似于文件夹,包的形式,命名空间


        var kai = {};
        kai.relationship = {
            teacher: {
                name: 'liulaogen',
                age: 45,
                say: function () { console.log('我是你们的老师' + this.name + ',现在开始上课') }
            },
            parents: {
                phone: '15210000000',
                docook: function () {
                    console.log('我是' + this.name + ',我来给你做饭')
                }
            }
        }
        console.log(kai.relationship.teacher.name);
        kai.relationship.parents.docook();
             
posted @ 2017-04-25 15:24  凯帝农垦  阅读(150)  评论(0编辑  收藏  举报