JSON解谈

JSON现在广泛用于前后台数据交互,是现在最流行的交互数据格式。数据格式是一种在不同平台间传递的文本格式。JSON的全称Java Script Object Notation(JavaScript对象表示法),表示法的意思,用于表示数字或的单词等数据的字符系统。

JSON的分类

1.简单的JSON对象

{
    “name”:"Curry",
    “age”:20
}

对行啊直接量

//键值名带引号
var person = {
    “name”:"Curry",
    “age”:20
};
console.log(type.person); //Object

//键值名不带引号
var person = {
    name:Curry,
    age:20
};
console.log(type.person); //Object

二者区别:

  • 对象直接量有声明变量(JSON中没有)
  • 对象直接量是JavaScript语句,所以末尾有” ; “
  • 对象直接量键值名引号可有可无,而JSON中必须带有引号

复杂的JSON对象

["Curry", 12]
//

[ 
    {
        "name":"Curry",
        "age": 12
    }
]

//
[
    {
        "name":"Curry",
        "age":12,
        "like":["eat","drink"]
    },
    {
        "name":"Curry",
        "age":12,
        "like":["eat","drink"]
    }
]
//
[
    {
        "name":"Curry",
        "age":12,
        "like":{
            "eat":"banner",
            "drink":"water"
        }
    },
    {
        "name":"Curry",
        "age":12,
        "like":{
            "eat":"banner",
            "drink":"water"
        }
    }
]

json数组数据层层加深,因此可以表示复杂的数据

JSON字符串和JSON对象
有时候后台传过来的是JSON字符串,而我们当做JavaScript对象处理,调用方法,那自然就会出错。
1.stringify() 方法—参数(必选)

var person={
    "name":"Curry",
    "age":12
};
console.log(typeof person); //Object

var jsonString = JSON.stringify(peson);
console.log(typeof jsonString); //String

用法是:将object对象转化为json字符串
类型转换:Object–>String
2.parse()方法—>参数

var person = {
    "name":"Curry",
    "age":12
};
console.log(typeof myMes);//Object

//模拟json字符串
var jsonString = JSON.stringify(myMes);
console.log(typeof jsonString);//String

var jsonObject = JSON.parse(jsonText);
console.log(typeof jsonObject); //Object

用法如上,作用是将json字符串转化为json对象,为了模拟json字符串,我们先用stringify方法制造了一个json字符串。
类型变化:String -> Object

JSON的序列化
stringify()可以接受第二个参数,[过滤条件],返回过滤后的json对象
数组条件过滤,如[“name”,”age”]

var person = {
        "name": "Curry",
        "age": 20,
        "like": "drink",
        "nationality": "China"
    };
//实现过滤,只留下name和age  
var jsonString = JSON.stringify(person,["name","age"]);
cosole.log(jsonString);  //{"name":"Curry","age":"20"}

函数过滤
当使用函数条件过滤时候,我们就可以按照我们需求做出处理了

var person = {
        "name": "Curry",
        "age": 20,
        "like": "drink",
        "nationality": "China"
    };

var jsonString = JSON.stringify(person,function(key, value){
    switch(key){
        case "name":
            return "KD"
        default:
            return value;
    }

},4);
//{"name":"KD","age":12,"like": "drink","nationality": "China"}

对于第三个参数,上述代码中4的用法,下文有讲,关于这个函数过滤function(key, value){},key为键值对名,value存储值

json字符串格式序列化
也就是用到stringify()的第三个参数

 var myMes= {
        "name": "ys",
        "age": 12,
        "like": "drink",
        "nationality": "China"
    };
    var jsonText = JSON.stringify(myMes, ["name","age"],4);
    console.log(jsonText); //{"name": "ys", "age": 12}

如上代码,我们给stringify()设置了第三个参数,【缩进控制】

toJSON()方式
实现自定义序列化方法,具有优先执行性

var person = {
    "name":"Curry",
    "age":12,
    toJSON:function(){
    }
};

var jsonString = JSON.stringify(person);
console.log(jsonString);  //"Curry"

执行机理:
如果存在toJSON()方法,且能通过它取得有效的值,则调用改方法,否则返回对象本身.
通过第一步得到值之后,如果有过滤函数.则将返回值传入到过滤函数
通过过滤函数序列化后,如果存在第三个参数【格式控制】话,则格式化。

JSON解析
json字符串中包含对象如何正确解析
parse() 第二个参数的用法,我们又叫他”还原函数”

//定义一个构造对象的方法
function setMessage(eat, drink){
    this.eat=eat;
    this.drinl = drink;
    this.getEat= function(){
        return this.eat;
    };
}
//定义一个myName的对象
var = myMessi = {
    "name":"Curry",
    "age": 12,
    "message": new setMessage("banana", "water")
};

//模拟json字符串
var jsonString= JSON.stringify(myMes);
var jsonObj = JSON.parse(jsonString);
console.log(jsonObj.message);  //{eat: 'banana',drink:'water'}

没错,可以访问到,那么我想访问getEat()方法呢,调用了一下,惊奇的发现是错的,难道我们的代码出现了问题,事实就是这样,因为在由Object -> String -> Object时候,我们的new setMessage()失去了对象的功能。或许你会认为我们只是转化模拟,事实实际开发过程就是这样,数据传输的时候,也是经过了Object -> String -> Object(后台封装对象,传输变成string,解析成Object),问题出现了,那么自然有解决办法。

//定义一个构造方法
function setMessage(eat, drink){

        this.eat = eat;
        this.drink = drink;
        this.getEat = function(){
            return "你想吃" + this.eat;
        };
    }
//定义一个myName的对象 
    var myMes = {
        "name": "ys",
        "age": 12,
        "message": new setMessage("banana", "water")
    };
    //为了模拟json字符串
    var jsonText = JSON.stringify(myMes);

    var jsonObj = JSON.parse(jsonText, function(key, value){
        switch(key){
            case "message":
                return new setMessage(value.eat, value.drink);
            default:
                return value;
        }
    });
    console.log(jsonObj.message.getEat());  //你想吃banana

其实,我们可以看到,只要有函数参数,我们就可以用函数去实现很过功能,反而拓展性更强了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值