JSON数据

一、json值的类型

  1. 简单值: 可以表示字符串,数值,布尔值,null不支持undefined(json的数值表示: 2 )

  2. 对象: 一组有序的键值对,每个键值对的值可以是简单值,也可以是复杂数据类型。(json的字符串:“hello world”)。json字符串与javascript字符串的区别,json必须用双引号。

  3. 数组:一组有序值的列表,数组的值可以是简单值,也可以是复杂数据类型。

不支持变量,函数,以及对象实例

二、json对象与javascript对象

区别:

            //javascript对象
            var obj = {
                name: "liu",
                age: 33,
            };


            // json对象
            {
                "name": "liu",
                "age": 33,
            }
  1. 没有声明变量(json中没有变量的说法)
  2. 没有末尾分号()
  3. json中属性也要加双引号

三、字符串与json对象转换

1、JSON.parse()。parse把字符串解析成原生javascript值(javascript对象);每个属性名都必须用双引号

var str = '{"name":"huangxiaojian","age":"23"}';
console.log(JSON.parse(str));  //Object { name: "huangxiaojian", age: "23" }

接收另一个参数,为区别JSON.stringify()的过滤函数(过滤器), 因而叫还原函数。如下:

                var book = {
                    title: "hello",
                    author: [ "apple" ],
                    year: 300,
                    releaseDate: new Date(2016)
                };

                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.releaseDate.getFullYear() );

以上代码book对象,有个releaseDate属性,保存Date对象,经过序列化后变成有效的JSON数据字符串,然后经过解析又在bookCopy中还原为一个Date对象,当遇到releaseDate键值时,会基于相应的值创建一个新的Date对象,结果就是bookCopy.releaseDate属性中保存一个新的Date对象。

2、JSON.stringify( object, selector, retract ) 对象,过滤器(数组或函数),保留缩进。

selector : 可选,用于转换结果的函数或数组。

如果 selector为函数,则 JSON.stringify 将调用该函数,并传入每个成员的键和值。使用返回值而不是原始值。如果此函数返回 undefined,则排除成员。根对象的键是一个空字符串:”“。

如果 replacer 是一个数组,则仅转换该数组中具有键值的成员。成员的转换顺序与键在数组中的顺序一样。当 value 参数也为数组时,将忽略 replacer 数组。

JSON.stringify()把json对象序列化为字符串。(忽略函数、原型)

var a = {a:1,b:2};
console.log(JSON.stringify(a));  //{"a":1,"b":2}不包含任何空格字符或缩进

3、JSON.stringify()第二个参数,过滤器为数组

过滤器:可以使数组(如果是数组,就把数组中有的属性保留),也可以是函数(如果是函数,传两个参数:属性和属性值)。

var person = {
   name: "liu",
   age: 33,
   eat: [ "apple" ],
   sex: "man"
}
var jsonText = JSON.stringify( person, ["eat", "age" ] )
console.log( jsonText )  //{"eat":["apple"],"age":33}

4、JSON.stringify()第二个参数为函数

函数必须返回值,才能打印key和value

      var person ={"cc": "33", "dd": 55};
      var jsonText = JSON.stringify( person , ff);
        function ff(key, value) {
          console.log( key );
          console.log( value );
          return value
        }
      console.log( jsonText ); // string {"cc":"33","dd":55}

5、缩进,最大缩进为10。超过10 会转换为10

        var person = {
            "name": "liu",
            "age": 33,
            "eat": [ "apple" ],
            "sex": "man"
        }
        var jsonText = JSON.stringify( person, null, 4 ) 
        console.log( jsonText )


/////////////////////////结果,带有格式////////////////////
{
    "name": "liu",
    "age": 33,
    "eat": [
        "apple"
    ],
    "sex": "man"
}



        //特别的缩进方式
        var jsonText = JSON.stringify( person, null, "---" ) 
        console.log( jsonText )
/////////////////////////结果,带有格式////////////////////
{
---"name": "liu",
---"age": 33,
---"eat": [
------"apple"
---],
---"sex": "man"
}

6、toJSON()方法,返回自身的json数据格式。

        var date = new Date()
        console.log( date.toJSON() )  

 //person自身没有json数据格式,这是错的。
        var person = {
            "name": "liu",
            "age": 33,
            "eat": [ "apple" ],
            "sex": "man"
        }
console.log( person.toJSON() )   

7、为对象添加toJSON()方法,返回字符串则是字符串格式,对象则是对象格式,单个数值就是数值格式。

                var person = {
                    "name": "liu",
                    "age": 33,
                    "eat": [ "apple" ],
                    "sex": "man",
                    "toJSON": function () {
                        return this.age
                    }
                }
                console.log( person.toJSON() )  // 33

toJSON()可以做过滤器补充

8、假设一个对象传入JSON.stringify(),序列化该对象的顺序

  1. 存在toJSON()方法,且能获取有效值,则调用该方法,否则按默认顺序序列化。
  2. 如果提供了第二个参数,应用这个函数过滤器,传入函数过滤器的值是第1步的返回值。
  3. 对第2步返回的每个值进行序列化。
  4. 如果提供了第三个参数,执行相应的格式化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值