• JSON字符串和Javascript对象字面量


    JSON字符串和Javascript对象字面量

    JSON是基于Javascript语法的一个子集而创建的,特别是对象和数组字面量语法。

    正是由于JSON的这种特殊来历,导致很多Javascript程序员往往会混淆Javascript对象字面量和JSON。

    1 JSON是纯文本,不是Javascript代码

    JSON是作为XML的替代品而出现的,它本身是一种跨平台的数据表示标准,是纯文本字符串,不局限于任何编程语言。

    Javascript代码则必须需符合其语言规范,不能在其他语言中直接使用。

    2 JSON文本是Javascript语言中的合法源代码

    然而由于JSON本身选用了Javascript的语法子集,导致了JSON字符串本身就是合法的Javascript源代码片段。

    var person = 
    // 下面的Javascript代码正好符合JSON
    {
        "name": "SMSTONG",
        "title": "DBA“,
        "age": 18
    }

    然而,我们不能把上面的代码叫做JSON,因为它出现在Javascript源文件中,是Javascript代码,不是纯文本。只能把它叫做Javascript对象字面量。

    3 Javacript字面量代码不一定是合法的JSON文本

    所有的JSON文本都是合法的Javascript源代码片段,但是反过来去不成立。因为JSON只是Javascript的一个子集而已,Javascript还有很多的部分是不符合JSON规范的。例如:

    var person = 
    // 下面的Javascript代码不符合JSON
    {
        name: "SMSTONG",
        title: "DBA“,
        age: 18
    }

    我们把包围属性名的双引号去掉了,仍然是合法有效的Javscript对象字面量代码,但已经不是合法的JSON文本了,因为JSON要求所有的属性必须加双引号。

    不单单是引号的问题,Javascript中还有很多数据类型也是JSON不支持的,如函数:

    var person =
    {
        "name":"SMSTONG",
        "fight": function(){
            alert('fighting the enemy!');
        }
    }

    上面是非常常见的合法的对象字面量,然而却不是合法的JSON,因为JSON还不支持函数这种数据类型。

    4 eval()的参数是Javascript源代码片段,而不是JSON字符串

    eval(str)函数本质上是把str作为Javascript代码来执行的,例如:

    var obj = eval("{}");

    上述代码运行时会产生错误,因为eval会把{}当成是没有名字的Javascript语句。

    解决办法是,加上小括号:

    var obj = eval("({})");

    此时,小括号内部先运算得到一个空对象,然后返回。

    对于JSON字符串,通用的解析方法为:

    var obj = eval("(" + jsonText + ")");

    在ECMAScript3.1标准中,已经提供了一个名为JSON的全局对象,专门用来解析和反解析JSON字符串。

    var obj = JSON.parse("{}");

    与eval完全不同,JSON.parse()方法,把参数当成是JSON字符串文本,而不是Javascript代码,所以只要是合法的JSON字符串就可以。

    1.首先明确JSON是什么?

    • json是一种数据交换格式,是纯文本的字符串,是作为一种替代XML数据格式角色出现,json简单易读方便转换跨平台,有很多json api提供了json字符串与对象互转的方法,如下面JavaScript中json字符串互转的方法。
    JSON.stringify()//将对象转化为json字符串
    JSON.parse()//将json字符串转化了对象
    

    2.JSON和JavaScript的关系是怎样的呢 ?

    • json开始是JavaScript语法中的一个子集,后来人们觉得这种形式的用来作为数据交换格式不错,就单独将它拿了出来,这也是造成大家对JSON,JSON字面量,JSON对象之间混淆不清的缘由了。

    3.JSON字面量又是什么呢

    • 一般的我们创建一个对象的方法
    var obj1=new Object();
    var obj2={}//字面量
    
    • 上面的第二种就是JavaScript对象字面量的写法。那那json字面量是什么呢,那我们在看看下面的一段代码
    var person={
          "name":"xianyu",
          "age":24,
          "love":"Online Game"
    }
    
    • 从上我们可以看出这就是用字面量表示一个对象,而这个格式就是json格式的, 因为本身json就是JavaScript语法集的一种,所以json字面量就是用json格式的JavaScript对象字面量。

    • json放到JavaScript中执行是合法代码,是JavaScript对象字面量,但是JavaScript对象字面量不一定是json

    var person={
          "name":"xianyu",
          "age":24,
          "love":"Online Game"
    }
    //和
    var person={
          name:'xianyu',
          age:24,
          love:'Online Game',
          skill:function(){
                alert('basketball')
          }
    }
    
    • json必须是符合以下
      • 1.键一定要用双引号,值如果是字符串也要用双引号包括
      • 2.数据只包括,数字,布尔,数组,null,对象,字符串
    • 而JavaScript对象字面量属性不用引号也可以,而且值可以是任何类型,函数,undefined或者是正则都是可以的 。json只是JavaScript语法集中的一种,还有很多其他部分的东西都是不符合json的规范。

    4.那JSON对象什么呢

    • JSON对象就是JavaScript中的一个对象,里面有一些属性和方法供我们使用,如下面2个方法
    JSON.stringify()//将对象转化为json字符串
    JSON.parse()//将json字符串转化了对象
    //利用这2个方法也用可以做一个对象深拷贝
    
    • 额外扩展深拷贝
    var obj={name:'xianyu',age:24}
    var str=JSON.stringify(obj)//得到json字符串
    str=JSON.parse(str)//得到Object {name: "xianyu", age: 24}
    str==obj//得到false
    var obj1 = obj //直接赋值得到的只是一个指针,两者指向东西都是一样的
    obj1==obj//得到true
  • 相关阅读:
    woj 1574
    UESTC 594 我要长高 dp单调队列
    HDU 3401 Trade dp 单调队列优化
    HDU 2844 Coins 多重背包
    2-1
    1-2
    1-1
    12-1
    9-1
    14-8
  • 原文地址:https://www.cnblogs.com/lsgxeva/p/7985271.html
Copyright © 2020-2023  润新知