zoukankan      html  css  js  c++  java
  • JSON

    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。

    JSON的四个基本规则

    1.并列的数据之间用逗号(",")分隔

    2.映射用冒号(":")表示

    3.并列数据的集合(数组)用方括号("[]")表示

    4.映射的集合(对象)用大括号("{}")表示

    举例:

    北京市的面基为16800平方公里,常住人口1600万人。上海市的面基为6400平方公里,常住人口1800万。

    转换成JSON格式后:

    [
    {"城市":"北京","面积":16800,"人口":1600},
    {"城市":"上海","面积":6400,"人口":1800}
    ]

    JSON优点:

    1.数据格式比较简单,易于读写,格式都是压缩的,占用带宽小。

    2.支持多种语言,包括ActionScript,C,C#,ColdFusion,Java,JavaScript,Perl,PHP,Python,Ruby等服务器端语言,便于服务器端的解析。

    JSON缺点:

    1.要求字符集 必须是Unicode,受约束性强

    2.语法过于严谨,必须遵循JSON语法四个原则

    JSON的语法可以表示三种类型的值:

    1.简单值:使用与JavaScript相同的语法,可以在JSON中表示字符串、数值、布尔值和null,不支持undefined;

    JSON表示字符串的方式:“Hello world"(JSON字符串必须使用双引号

    2.对象

    对象作为一种复杂数据类型,表示一组无序键值对。每个键值对中的值可以是简单值,也可以是复杂数据类型的值;

    与JavaScript的对象字面量相比,JSON对象有两个不一样的地方,首先没声明变量,其次,没有末尾的分号;

    JavaScript创建对象字面量:(标准写法中属性不用引号,也可以加上引号)

    var object={
             name:"Andy",
             age:29
           };

    JSON对象:

    {
             "name":"Andy",
             "age":29,
             "school":{
                "name":"Hubei Univercity",
                "location":"Wuchang"
             }
           }

    3.数组:数组也是一种复杂数据类型,表示一组有序的值的列表,可以通过数组索引来访问其中的值。数组的值也可以是任意类型——简单值、对象或数组。

    JavaScript中的数组字面量:

    var values=[25,"hi",true];

    JSON中把数组和对象结合起来:

     {
             {
                "title":"Javascript",
                "authors":[
                   "zhangsan"
                ],
                edition:3,
                year:2013
             },
             {
                "title":"HTML",
                "authors":[
                   "zhangsan",
                   "lisi"
                ],
                edition:3,
                year:2013
             },
    {
                "title":"Css",
                "authors":[
                   "wangwu"
                ],
                edition:1,
                year:2011
             }
    }

    JSON数据结构能够被解析为有用的JavaScript对象

    把解析JSON数据结构后得到的对象保存到变量books中后,下面一行代码就可取到第三本书的书名

    books[2].title

    在DOM结构中查找数据的代码:

    doc.getElementsByTagName("book")[2].getAttribute("title");

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

     var book = {
                "title":"Javascript",
                "authors":[
                   "zhangsan"
                ],
                edition:3,
                year:2013
             };
    var jsonText=JSON.stringify(book);
    var bookCopy=JSON.parse(jsonText);

    book和bookCopy虽然有相同的属性,但是它们是两个独立的、没有任何关系的对象

    序列化选项

    JSON.stringify()除了要序列化的JavaScript对象外,还可以接收另外两个参数,这两个参数用于指定以不同的方式序列化JavaScript对象。

    第一个参数是过滤器,可以是一个数组,也可以是一个函数;第二个参数是一个选项,表示是否在JSON字符串中保留缩进(默认是没有空格缩进的)。

    1.过滤结果

    如果过滤器参数是数组,那么JSON.stringify()的结果中将只包含数组中列出的属性

    var jsonText=JSON.stringify(book,["title","edition"]);

    过滤得到的JSON对象如下:

    {"title":"JavaScript","edition":3}

    如果过滤器参数是函数:传入的函数接收两个参数,属性(键)名和属性值,根据属性名可以知道怎么处理要序列化的对象中的属性。属性名只能是字符串,而在值并非键值对结构的值事,键名可以是空字符串。(如果函数返回的是undefined,那么相应的属性会被忽略)

    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;
              }
           });

    第一次调用这个函数过滤器,传入的键是一个空字符串,而值就是book对象。序列后的JSON字符串如下:

    {"title":"JavaScript","author":"zhangsan","year":5000}

    2.字符串缩进

    var jsonText=JSON.stringify(book,null,4);//表示缩进为4

    最后得到的json对象如下:

    {
            "title":"Javascript",
            "authors":[
                   "zhangsan"
            ],
            edition:3,
            year:2013
     }

    3.toJSON()方法

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

    最后得到的JSON对象为:"JavaScript"

    toJSON()可以作为函数过滤器的补充。假设把一个对象传入JSON.stringify(),序列化该对象的顺序如下:

    (1) 如果存在toJSON()方法而且能通过它取得有效的值,则调用该方法。否则,返回对象本身。

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

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

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

    解析选项

    JSON.parse()方法和JSON.stringify()方法用法类似,只是接收的函数被称为还原函数(后者的叫做过滤函数)。在将日期字符串转换为Date()对象时,经常要用到还原函数

     1  var book = {
     2             "title":"Javascript",
     3             "authors":[
     4                "zhangsan"
     5             ],
     6             edition:3,
     7             year:2013,
     8             releaseDate:new Date(2011,11,1)
     9          };
    10          var jsonText=JSON.stringify(book);
    11          var bookCopy=JSON.parse(jsonText,function(key,value){
    12              if(key=="releaseDate"){
    13                  return new Date(value);
    14              }else{
    15                  return value;
    16              }
    17          });
    18        alert(bookCopy.releaseDate.getFullYear());

    在上述代码中,还原函数在遇到"releaseDate"键时,会基于相应的值创建一个新的Date对象,结果就是bookCopy.releaseDate属性中会保存一个Date对象。所以才能基于这个对象调用getFullYear()方法。

  • 相关阅读:
    SynchronousQueue 的联想
    Spring Cache
    CSUOJ 1011 Counting Pixels
    CSUOJ 1973 给自己出题的小X DFS
    CSUOJ 1726 你经历过绝望吗?两次!BFS+优先队列
    CSUOJ 1900 锋芒不露
    CSUOJ 1808 地铁
    CSUOJ 1895 Apache is late again
    CSUOJ 1781 阶乘除法
    CSUOJ 1560 图书管理员的表白方式
  • 原文地址:https://www.cnblogs.com/luoyanan/p/5467340.html
Copyright © 2011-2022 走看看