JavaScript-JSON

107 阅读2分钟

1. JSON历史/作用/应用

在目前的开发中,JSON是一种非常重要的数据格式,它并不是编程语言,而是一种可以在服务器和客户端之间传输的数据格式。

  • JSON的全称是JavaScript Object Notation(JavaScript对象符号):

    • JSON是由Douglas Crockford构想和设计的一种轻量级资料交换格式,算是JavaScript的一个子集

    • 虽然JSON被提出来的时候是主要应用JavaScript中,但是目前已经独立于编程语言,可以在各个编程语言中使用

    • 很多编程语言都实现了将JSON转成对应模型的方式

  • 目前JSON被使用的场景也越来越多:

    • 网络数据的传输JSON数据

    • 项目的某些配置文件

    • 非关系型数据库(NoSQL)将json作为存储格式

2. JSON的基本语法

  • JSON的顶层支持三种类型的值:

    • 简单值:数字(Number)、字符串(String,不支持单引号)、布尔类型(Boolean)、null类型

    • 对象值:由key、value组成,key是字符串类型,并且必须添加双引号,值可以是简单值、对象值、数组值

    • 数组值:数组的值可以是简单值、对象值、数组值

  • 注意:不能使用注释,只能使用双引号,最后一个属性不可有逗号

    {
      "name": "lilei",
      "age": 18,
      "friend": {
        "name": "hanmeimei",
        "age": 17
      }
    }
    

3. JSON的序列化和反序列化

  • 序列化:将JavaScript中的复杂类型转化成JSON格式的字符串

  • 反序列化:将JSON格式的字符串转化成对象

4. stringify和parse方法

  • 在ES5中引用了JSON全局对象,该对象有两个常用的方法:

    • stringify方法:将JavaScript类型转成对应的JSON字符串

    • parse方法:解析JSON字符串,转回对应的JavaScript类型

       var obj = {
         name: "lilei",
         age: 18,
         friend: {
           name: "hanmeimei"
         }
       }
    
       console.log(obj.name, obj.age)
    
       // 1.将obj对象进行序列化
       var objJSONString = JSON.stringify(obj)
       console.log(objJSONString)
    
       // 2.将对象存储到localStorage
       localStorage.setItem("info", objJSONString)
    
       var item = localStorage.getItem("info")
       console.log(item, typeof item) // string
    
       // 3.将字符串转回到对象(反序列化)
       var newObj = JSON.parse(item)
       console.log(newObj)
    
  • JSON应用

    • 能够实现深拷贝(循环引用除外)

    • 判断对象是否为空

      var data = {}
      var b = (JSON.stringify(data) == "{}")
      alert(b) //true
      
  • JSON.stringify() 方法将一个 JavaScript 对象或值转换为 JSON 字符串:

    • 如果指定了一个 replacer 函数,则可以选择性地替换值

    • 如果指定的 replacer 是数组,则可选择性地仅包含数组指定的属性

    var obj = {
      name: "lilei",
      age: 18,
      friend: {
        name: "hanmeimei"
      },
      toJSON: function() {
        return "123"
      }
    }
    
    // 1.replacer参数
    // var objJSONString = JSON.stringify(obj, function(key, value) {
    //   if (key === "name") {
    //     return "kobe"
    //   }
    //   return value
    // }, "")
    // console.log(objJSONString)
    
    // 2.space参数
    // var objJSONString = JSON.stringify(obj, null, 4)
    // console.log(objJSONString)
    
    // 3.如果对象本身有显示toJSON方法, 那么直接调用toJSON方法
    var objJSONString = JSON.stringify(obj)
    console.log(objJSONString) // "123"
    
    var newObj = JSON.parse(objJSONString, function(key, value) {
      if (key === "age") {
        return value + 2
      }
      return value
    })
    console.log(newObj)  // age会变成20