zoukankan      html  css  js  c++  java
  • Json杂谈系列------(一)初始json

    1. JSON 是什么

    JSON,全称是 JavaScript Object Notation,即 JavaScript 对象标记法。这是一种轻量级(Light-Weight)、基于文本的(Text-Based)、可读的(Human-Readable)格式。

    JSON 的名称中虽然带有 JavaScript,但这是指其语法规则是参考 JavaScript 对象的,而不是指只能用于 JavaScript 语言。实际上很多语言(如 C++、Java、PHP 等)都配有 JSON 的解析和生成器。

    JSON 无论对于人,还是对于机器来说,都是十分便于阅读和书写的,而且相比 XML (另一种常见的数据交换格式),文件更小,因此迅速成为网络上十分流行的交换格式。

    2. JSON 的语法规则

    1. 数组(Array)用方括号(“[]”)表示。
    2. 对象(Object)用大括号(”{}”)表示。
    3. 名称/值对(name/value)之间用冒号(”:”)隔开。
    4. 名称(name)置于双引号中,值(value)有字符串、数值、布尔值、null、对象和数组。
    5. 并列的数据之间用逗号(“,”)分隔
    6. 数组或对象的每个成员的值,可以是简单值,也可以是复合值

    需要注意的是,空数组和空对象都是合格的JSON值,null本身也是一个合格的JSON值。

    简单案例:

    //描述学生信息的案例
    {
        "name":"zhangsan",
        "age":23,
        "sex":"male",
        "class":"Computer Science",
        "studentNumber":"20120101",
        course:[
        {courseNo:"2015001","courseName":"数据结构",teacherName":"Lisi"},
        {courseNo:"2015002","courseName":"数据库原理",teacherName":"Wangwu"}
        ]
    }

    3. JSON 和 XML

    JSON 常被拿来与 XML 做比较,因为 JSON 的诞生本来就多多少少要有取代 XML 的意思。相比 XML,JSON 的优势如下:

    • 没有结束标签,长度更短,读写更快
    • 能够直接被 JavaScript 解释器解析
    • 可以使用数组

    下面是描述同样信息的 XML 文件和 JSON 文件,来看看区别。JSON:

    {
        "name": "Geoff Lui",
        "age": 26,
        "isChinese": true,
        "friends":["Lucy", "Lily", "Gwen"]
    }

    XML:

    <root>
        <name>Geoff Lui</name>
        <age>Geoff Lui</age>
        <friends>Lucy</friends>
        <friends>Lily</friends>
        <friends>Gwen</friends>
    </root>

    可以看到,描述同样的信息,XML 更加麻烦,而 JSON 要轻巧得多,在有数组出现的情况下更加明显。而且,当数组项很多的时候,XML 文件中的大量信息都被用于描述没什么用的标签上了。

    但是,绝不是说 XML 就一无是处,要完全放弃,归根结底还是要看有怎样的开发要求。

     

    4.JSON对象

    处理JSON格式的数据。它有两个方法:JSON.stringify和JSON.parse。

    4.1、stringify()

    JSON.stringify方法用于将一个值转为字符串。该字符串符合JSON格式,并且可以被JSON.parse方法还原。

    JSON.stringify("somestring") // "somestring"
    JSON.stringify(1) // "1"
    JSON.stringify(false) // "false"
    JSON.stringify([]) // "[]"
    JSON.stringify({}) // "{}"
    
    JSON.stringify([1, "false", false])
    // '[1,"false",false]'
    
    JSON.stringify({ "name": "张三" })
    // '{"name":"张三"}'

    需要注意的是,对于原始类型的字符串,转换结果会带双引号,即字符串somestring会被转成"somestring",这是因为将来还原的时候,双引号可以让JavaScript引擎知道,abc是一个字符串,而不是一个变量名。

    如果原始对象中,有一个成员的值是undefined、函数或XML对象,这个成员会被省略。如果数组的成员是undefined、函数或XML对象,则这些值被转成null。

    JSON.stringify({
        f : function () {},
        a : [function () {}, undefined]
    });
    // "{"a":[null,null]}"

    JSON.stringify方法会忽略对象的不可遍历属性。

    var obj = {};
    Object.defineProperties(obj, {
      'foo': {
        value: 1,
        enumerable: true
      },
      'bar': {
        value: 2,
        enumerable: false
      }
    });
    
    JSON.stringify(obj); // {"foo":1}

    JSON.stringify方法还可以接受一个数组参数,指定需要转成字符串的属性。

    console.log(JSON.stringify({ name:"zhangsan", age:22 }, ['name']));
            //  {"name":"zhangsan"}

    JSON.stringify方法还可以接受一个函数作为参数,用来更改默认的字符串化的行为。

    function f(key, value) {
      if (typeof value === "number") {
        value = 2 * value;
      }
      return value;
    }
    
    JSON.stringify({ a:1, b:2 }, f)
    // '{"a":2,"b":4}'

    JSON.stringify还可以接受第三个参数,用于增加返回的JSON字符串的可读性。如果是数字,表示每个属性前面添加的空格(最多不超过10个);如果是字符串(不超过10个字符),则该字符串会添加在每行前面。

    JSON.stringify({ p1:1, p2:2 }, null, 2);
    // "{
      "p1": 1,
      "p2": 2
    }"
    
    JSON.stringify({ p1:1, p2:2 }, null, "|-");
    // "{
    |-"p1": 1,
    |-"p2": 2
    }"

    如果JSON.stringify方法处理的对象,包含一个toJSON方法,则它会使用这个方法得到一个值,然后再将这个值转成字符串,而忽略其他成员。

    JSON.stringify({
      toJSON: function() {
        return "Cool"
      }
    })
    // "Cool""
    
    var o = {
      foo: 'foo',
      toJSON: function() {
        return 'bar';
      }
    };
    var json = JSON.stringify({x: o}); 
    // '{"x":"bar"}'

    toJSON方法的一个应用是,可以将正则对象自动转为字符串。

    RegExp.prototype.toJSON = RegExp.prototype.toString;
    
    JSON.stringify(/foo/)
    // "/foo/"

    4.2、JSON.parse()

    JSON.parse方法用于将JSON字符串转化成对象。

    JSON.parse('{}') // {}
    JSON.parse('true') // true
    JSON.parse('"foo"') // "foo"
    JSON.parse('[1, 5, "false"]') // [1, 5, "false"]
    JSON.parse('null') // null
    
    var o = JSON.parse('{"name":"张三"}');
    o.name // 张三

    如果传入的字符串不是有效的JSON格式,JSON.parse方法将报错。为了处理解析错误,可以将JSON.parse方法放在try...catch代码块中。

    JSON.parse方法可以接受一个处理函数,用法与JSON.stringify方法类似。

    function f(key, value) {
      if ( key === ""){
          return value;
      }
      if ( key === "a" ) {
        return value + 10;
      }
    }
    
    var o = JSON.parse('{"a":1,"b":2}', f);
    o.a // 11
    o.b // undefined
    1. 参考链接:JSON.parse()
    2. 阮一峰的教程
  • 相关阅读:
    POJ 2155:Matrix 二维树状数组
    POJ 2823:Sliding Window 单调队列
    POJ 3007:Organize Your Train part II
    51nod 1208 && POJ 2482:Stars in Your Window
    POJ 3061:Subsequence 查找连续的几个数,使得这几个数的和大于给定的S
    51nod 1206:Picture 求覆盖周长
    POJ 1195:Mobile phones 二维树状数组
    lightoj 1319
    暴力大法好
    Poj1273--Drainage Ditches(最大流)
  • 原文地址:https://www.cnblogs.com/doctorJoe/p/4815467.html
Copyright © 2011-2022 走看看