zoukankan      html  css  js  c++  java
  • Json

      来自《javascript高级程序设计 第三版:作者Nicholas C. Zakas》的学习笔记(八)

      JSON是一种数据格式而不是一种编程语言,JSON是javascript的一个严格的子集,利用了javascript中的一些模式来表示结构化数据。

      javascript字符串与json字符串的最大区别在于,json字符串必须使用双引号,单引号会导致语法错误。

      与javascript的对象字面量进行比较:

    var people = {    //字面量
       name: "carol",
       age: 21 
    };
    
    {         //json
       "name": "carol",
        "age": 21
    }

      ① json中对象的属性必须加双引号;

      ② 没有声明变量(json)中没有变量的概念;

      ③ 没有末尾的符号(json不是javascript语句,所以不需要分号);

      json中的数据类型:可以是简单值,也可以是复杂值(如数组)。主要是对数组进行举例:

    {
        {
            "title": "Property",
            "authors": [
                    "carol"
             ],
             edition: 3,
             year: 2014
        }  ,
      {
            "title": "Property",
            "authors": [
                    "carol",
                   "xiaoming"
             ],
             edition: 3,
             year: 2014
        }  
    }

      可以把JSON数据结构解析为有用的javascript对象。以上为例,当解析为javascript对象后,就可以像下面这样,只需要一行代码就可以搞定取得第二本书的书名:

    book[1].title              //假设解析后的json数据结构得到的对象保存到了变量books中

       由于json是javascript语法子集,因此eval()函数可以解析、返回javascript对象和数组。但是使用eval()对json数据结构求值存在风险,因为可能存在一些恶意代码。

      json对象有两个方法:stringify()和parse()。在最简单的情况下,这两个方法分别用于把javascript对象序列化为json字符串和把json字符串解析为原生javascript值。如:

    var book = {
        title: "Property",
        authors: [
            "carol"
        ],
        edition: 3,
        year: 2011
    };
    
    var jsonText = JSON.stringify(book);

      默认情况下,JSON.stringify()输出JSON字符串不包含任何空格字符或缩进,因此保存在jsonText中的字符串如下所示:

    {"title":"property","author":["carol"],"edition":3,"year":2011}

      将JSON字符串直接传递给JSON.parse()就可以得到相应的javascript值。例如:

    var bookCopy = JSON.parse(jsonText);

      注意:虽然book和bookCopy具有相同的属性,但它们是两个独立的、没有任何关系的对象。如果传给JSON.parse()的字符串不是有效的JSON,该方法会抛出错误。

      序列化选项:

      其实还可以再JSON.stringify()中传递参数,过滤器(可以是一个数组,也可以是一个函数)、选项(表示是否在JSON字符串中保留缩进)。

    var book = {
        title: "Property",
        authors: [
            "carol"
        ],
        edition: 3,
        year: 2011
    };
    
    var jsonText = JSON.stringify(book,["title","edition"]);
    
    //jsonText的结果是    {"title":"Property","edition":3}

      如果第二个参数是函数,传入的函数接受两个参数,属性名和属性值。根据属性名可以知道应该如何处理要序列化的对象中的属性。属性名只能是字符串,而在值并非键值对儿结构的值时,键名可以是空字符串。为了改变序列化的结果,函数返回的值就是相应键的值。不过要注意,如果函数返回了undefined,那么相应的属性会被忽略。

    var book = {
        title: "Property",
        authors: [
            "carol"
        ],
        edition: 3,
        year: 2011
    };
    
    var jsonText = JSON.stringify(book,function(key,value) {
        switch(key) {
            case "authors":
                return value.join(",");
            case "year":
               return 5000;
            case "edition":
              return undefined;
            default:
              return value;
        }
    });

      JSON.stringify()方法的第三个参数用于控制结果中的缩进和空白符。如果这个参数是一个数值,那它表示的是每个缩进的空格数。例如,要在每个级别缩进4个空格,如:

    var book = {
        title: "Property",
        authors: [
            "carol"
        ],
        edition: 3,
        year: 2011
    };
    
    var jsonText = JSON.stringify(book,null,4);

      保存在jsonText中的字符串如下所示:

    {
        "title": "Property",
        "authors": [
            "carol"
        ],
        "edition": 3,
        "year": 2011
    }

      注意到没有,JSON.stringify()在结果字符串插入了换行符以提高可读性。只要传入有效的控制缩进的参数值,结果字符串就包含换行符。(只缩进而不换行意义不大。)最大缩进空格数为10,所以大于10的值都会自动转换为10。

      如果缩进参数是一个字符串而非数值,则这个字符串将在JSON字符串中被用作缩进字符(不再是空格)

    var jsonText = JSON.stringify(book,null,"--");
    //结果如下
    {
    --"title": "Property",
    --"authors": [
    ----"carol"
    --],
    -- "edition": 3,
    --"year": 2011
    } 
     //同样最长不超过10个字符串

      toJSON(),有时候,JSON.stringify()还是不能满足对某些对象进行自定义序列化的需求。原生对象有一个toJSON()方法,能够将javascript的Date对象自动转换成ISO 8610日期字符串,与在Date对象上调用toISOString()的结果完全一样。

    var book = {
        title: "Property",
        authors: [
            "carol"
        ],
        edition: 3,
        year: 2011,
        toJSON: function() {
            return this.title;
       } 
    };
     
    var jsonText = JSON.stringify(book);

      (1) 如果存在toJSON()方法而且能通过它取得有效的值,则调用该方法。否则,按默认顺序执行序列化;

      (2) 如果提供了第二个参数,应用这个函数过滤器。传入函数过滤器的值是第(1)步返回的值;

      (3) 对第(2)步返回的每个值进行相应的序列化;

      (4) 如果提供了第三个参数,执行相应的格式化。

      

      JSON和XML比较(转文):

    1.  在可读性方面,JSONXML的数据可读性基本相同。JSONXML的可读性可谓不相上下,一边是建议的语法,一边是规范的标签形式,很难分出胜负。

    2.  在可扩展性方面,XML天生有很好的扩展性,JSON当然也有,没有什么是XML能扩展,JSON不能的。

    3.  在编码难度方面,XML有丰富的编码工具,比如Dom4jJDom等,JSON也有json.org提供的工具,但是JSON的编码明显比XML容易许多,即使不借助工具也能写出JSON的代码,可是要写好XML就不太容易了。

    4.   在解码难度方面,XML的解析得考虑子节点父节点,让人头昏眼花,而JSON的解析难度几乎为0。这一点XML输的真是没话说。

    5.   在流行度方面,XML已经被业界广泛的使用,而JSON才刚刚开始,但是在Ajax这个特定的领域,未来的发展一定是XML让位于JSON。到时Ajax应该变成Ajaj(Asynchronous Javascript and JSON)了。

    6.   JSONXML同样拥有丰富的解析手段。

    7.   JSON相对于XML来讲,数据的体积小。

    8.   JSONJavaScript的交互更加方便。

    9.   JSON对数据的描述性比XML较差。

    10.  JSON的速度要远远快于XML

  • 相关阅读:
    zoj 1239 Hanoi Tower Troubles Again!
    zoj 1221 Risk
    uva 10192 Vacation
    uva 10066 The Twin Towers
    uva 531 Compromise
    uva 103 Stacking Boxes
    稳定婚姻模型
    Ants UVA
    Golden Tiger Claw UVA
    关于upper、lower bound 的探讨
  • 原文地址:https://www.cnblogs.com/Iwillknow/p/3606641.html
Copyright © 2011-2022 走看看