JSON-数据存储

142 阅读3分钟
概念

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

JSON的全称是JavaScript Object Notation(JavaScript对象符号): JSON是由Douglas Crockford构想和设计的一种轻量级资料交换格式;

但是虽然JSON被提出来的时候是主要应用JavaScript中,但是目前已经独立于编程语言,可以在各个编程语言中使用;很多编程语言都实现了将JSON转成对应模型的方式;

其他的传输格式:

XML(可扩展标记语言):在早期的网络传输中主要是使用XML来进行数据交换的,但是这种格式在解析、传输等各方面都弱于JSON,所以目前已经很 少在被使用了;
xml 被设计用来传输和存储数据(后端用自定义标签写好,浏览器获取后通过某种方式渲染加载到浏览器)
xml 和 html 的区别,html中都是预定义标签,xml中都是自定义标签(怎么定义名称都可以);

Protobuf:另外一个在网络传输中目前已经越来越多使用的传输格式是protobuf,但是直到2021年的3.x版本才支持JavaScript,所 以目前在前端使用的较少;

JSON的基础语法 JSON的顶层支持三种类型的值:
简单值:数字(Number)、字符串(String,不支持单引号)、布尔类型(Boolean)、null类型;
对象值:由key、value组成,key是字符串类型,并且必须添加双引号,值可以是简单值、对象值、数组值;
数组值:数组的值可以是简单值、对象值、数组值;

123,true //这中方式很少用到,且json中是不予许写注释的
// 数组形式
[ 100,  "json", { name:"json" } ]
//对象形式
{
  "name": "json",
  "age": 18,
  "obj": {}
}
JSON的序列化

json常用的两个方法,在ES5中引用了JSON全局对象,该对象有两个常用的方法:
stringify方法:将JavaScript类型转成对应的JSON字符串;
parse方法:解析JSON字符串,转回对应的JavaScript类型;

stringify

const obj = {
  name: "json",
  obj: {
    name: "json"
  },
  arr: ["arr1", "arr2"],
  // toJSON: function() {
  //   return "123456"
  // }
}

// 1.对象转成JSON字符串
const jsonString0 = JSON.stringify(obj)

// 2.stringify第二个参数replacer
// 2.1. 传入数组: 设定哪些是需要转换,哪些不需要
const jsonString1 = JSON.stringify(obj, ["name", "friends"])

// 2.2. 传入回调函数: 类似于遍历进行设置
const jsonString2 = JSON.stringify(obj, (key, value) => {
  if (key === "name") {
    return value = "JSON"
  }
  return value
})

// 3.stringify第三参数 space 针对于每个属性前的空(string/number)
const jsonString3 = JSON.stringify(obj, null, '--'/2)

// 4.如果obj对象中有toJSON方法 则只会执行toJSON方法的返回值

parse

// JSON.parse() 方法用来解析JSON字符串
const JSONString = '{"name":"json","obj":{"name":"json"}}'
// 第二个参数 reviver 函数用以在返回之前对所得到的对象执行变换(操作)
const info = JSON.parse(JSONString, (key, value) => {
  if (key === "name") {
    return value = 'JSON'
  }
  return value
})

JSON用于深拷贝

const jsonString = JSON.stringify(obj)
const jsonParse = JSON.parse(jsonString)

//这种深拷贝方法对函数是无效的,会屏蔽函数的转换
//另外我们生成的新对象和之前的对象并不是同一个对象