zoukankan      html  css  js  c++  java
  • JSON

    JSON也是一种数据结构格式,与XML相比,JSON操作起来要简单的多,受到广大程序猿的欢迎!完爆XML有没有~ 而且很多编程语言都有针对JSON的解析器和序列化器哟~

    JSON包含3中数据格式

    简单值:字符串、数值、布尔值、null。但是不支持undefined

    对象:。。。

    数组:。。

    注意事项

    1、JSON字符串必须使用双引号不能使用单引号,否则报错

    2、对象中的属性必须加上双引号,否则报错

    3、JSON中没有末尾分号

    4、数组和对象可以相互嵌套

    5、同一个对象中不能出现同一个同名属性

    解析与序列化

    解析就是将JSON数据解析为原生javascript值(JSON.parse())

    序列化就是将javascript对象序列化为JSON字符串(JSON.stringify())

    早期的JSON解析器是用eval()函数来解析的

    后来,ES5定义了个全局对象JSON,支持这个对象的浏览器有:IE8+、firefox3.5+、safari4+、chrome、opera10.5+。对于早期的浏览器可以使用一个shim:https://github.com/douglascrockford/JSON-js。对于不能支持原生JSON解析器的浏览器,使用这个shim是最佳选择。

    JSON.stringify():序列化

    默认情况下,此方法序列化后返回的JSON字符串里不包含任何空格和缩进,在序列化javascript对象时,所有函数及原型成员都会被有意忽略,不体现在结果中,此外任何属性值为undefined的属性都会被忽略

    一个小技巧:当我们需要复制一个对象时,我们通常的做法是,将对象深拷贝,但是通过JSON的两种方法,先将对象序列化,在将序列化后的JSON字符串解析成对象,这样,这两个对象就是一个完全不同的对象了!!!

    JSON.stringify()方法除了接收一个要被序列化的javascript对象,还可以接受另外两个参数,第一个参数是个过滤器,可以是一个数组,也可以是一个函数;第二个参数是一个选项,表示是否在JSON字符串中国保留缩进。单独或组合使用这两个参数,可以更全面深入的控制JSON的序列化。

    1.过滤结果

        var book={
                "title":"professionnal Javascript",
                "authors":["Nicholas C. Zakas"],
                "edition":3,
                "year":2011
          };
          var jsonText=JSON.stringify(book,["title","edition"]);
          console.log(jsonText);//{"title":"professionnal Javascript","edition":3}
          var jsonText2=JSON.stringify(book,function(key,value){
                switch(key){
                      case "authors":
                            return value.join(",");
                      case "year":
                            return 5000;
                      case "edition":
                            return undefined;
                      default:
                            return value;
                }
          });
          console.log(jsonText2);//{"title":"professionnal Javascript","authors":"Nicholas C. Zakas","year":5000}

    2.字符串缩进

    JSON.stringify()第三个参数控制结果中的缩进和空白符。如果是一个数值,那么表示的是每个级别缩进的空格数(最大只能到10,大于10的也是缩进10个空格)。例如:

        var jsonText3=JSON.stringify(book,null,4);
          console.log(jsonText3);
          {
                "title": "professionnal Javascript",
                "authors": [
                      "Nicholas C. Zakas"
                ],
                "edition": 3,
                "year": 2011
          }

    如果第三个参数是字符串:

        var jsonText4=JSON.stringify(book,null,"哈啊");
          console.log(jsonText4);
          {
          哈啊"title": "professionnal Javascript",
          哈啊"authors": [
          哈啊哈啊"Nicholas C. Zakas"
          哈啊],
          哈啊"edition": 3,
          哈啊"year": 2011
          }

    3.toJSON()方法:(自定义序列化方法)

        var book={
                "title":"professionnal Javascript",
                "authors":["Nicholas C. Zakas"],
                "edition":3,
                "year":2011,
                "toJSON":function(){
                      return this.title;
                }
          };
          var jsonText=JSON.stringify(book);
          console.log(jsonText);//"professionnal Javascript"

    JSON.parse():解析选项

    JSON.parse()方法也可以接受第二个参数,是一个函数,这个函数也有两个参数,分别表示对象的key和value,在解析每个属性时,都会调用这个方法:

        var book={
                "title":"professionnal Javascript",
                "authors":["Nicholas C. Zakas"],
                edition:3,
                year:2011,
                releaseDate:new Date(2011,11,1)
          };
          //先序列化一下这个对象将它变成json字符串
          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);
          //{title: "professionnal Javascript", authors: Array(1), edition: 3, year: 2011, releaseDate: Thu Dec 01 2011 00:00:00 GMT+0800 (中国标准时间)}
          console.log(bookCopy.releaseDate.getFullYear());//2011

    上述代码,如果按正常来说,从json格式解析出来的Date对象是不带原型的,但是通过上述处理,就可以让这个Date对象带原型,因此可以调用它原型的getFullYear()方法

  • 相关阅读:
    Android Button四种点击事件和长按事件
    Android 简单登陆 涉及 Button CheckBox TextView EditText简单应用
    Android EditText属性
    Android-TextView 控件常用属性以及基本用法
    对象数组空指针异常
    数字反转问题
    遇3问题
    队列解密QQ号
    线程先后执行问题
    小哼买书
  • 原文地址:https://www.cnblogs.com/fqh123/p/10618327.html
Copyright © 2011-2022 走看看