沃梦达 / IT编程 / 前端开发 / 正文

浅析JSON序列化与反序列化

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于阅读和编写,同时也易于机器解析和生成。

浅析JSON序列化与反序列化

JSON简介

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于阅读和编写,同时也易于机器解析和生成。

JSON格式的数据结构包括以下几个部分:

  • 数组:用方括号([])表示,里面包含一组项,各项之间用逗号隔开。
  • 对象:用花括号({})表示,里面包含一组键值对,各键值对之间用逗号隔开,键和值之间用冒号隔开。
  • 值:可以是字符串、数字、布尔值、null、数组或对象。
  • 字符串:用双引号("")括起来的字符序列,可以包含转义字符(如回车符、制表符等)。

JSON序列化

JSON序列化是将数据从原有的数据类型转换为JSON格式的过程,一般是将复杂的对象或数组转换为JSON字符串。

在JavaScript中,可以使用JSON.stringify()方法进行JSON序列化。该方法接受一个JavaScript对象或数组作为参数,并返回一个JSON格式的字符串。例如:

var person = {
  "name": "张三",
  "age": 20,
  "hobbies": ["游泳", "篮球"],
  "address": {
    "street": "江南大道",
    "city": "上海",
    "state": "上海市"
  }
};

var jsonString = JSON.stringify(person);
console.log(jsonString);

上述代码中,我们定义了一个名为person的对象,包含一些信息,然后使用JSON.stringify()方法将该对象序列化为JSON字符串,最后输出结果为:

{"name":"张三","age":20,"hobbies":["游泳","篮球"],"address":{"street":"江南大道","city":"上海","state":"上海市"}}

从上述结果可以看出,对象的各个属性已经转换为了JSON格式,字符串值被加了双引号,数组和子对象都被转换为了对应的JSON格式。

JSON反序列化

JSON反序列化是将JSON格式的数据转换为原有的数据类型的过程,一般是将JSON字符串转换为JavaScript对象或数组。

在JavaScript中,可以使用JSON.parse()方法进行JSON反序列化。该方法接受一个JSON格式的字符串作为参数,并返回一个JavaScript对象或数组。例如:

var jsonString = '{"name":"张三","age":20,"hobbies":["游泳","篮球"],"address":{"street":"江南大道","city":"上海","state":"上海市"}}';
var person = JSON.parse(jsonString);
console.log(person);

上述代码中,我们定义了一个JSON格式的字符串,然后使用JSON.parse()方法将该字符串反序列化为JavaScript对象,最后输出结果为:

{
  name: '张三',
  age: 20,
  hobbies: [ '游泳', '篮球' ],
  address: { street: '江南大道', city: '上海', state: '上海市' }
}

从上述结果可以看出,JSON字符串已经转换为了JavaScript对象,所有字符串值被去掉了双引号,数组和子对象都被转换为了对应的JavaScript对象。

示例说明

示例一

现在我们定义一个包含函数的对象,然后将其序列化成JSON字符串:

var person = {
  "name": "张三",
  "age": 20,
  "hobbies": ["游泳", "篮球"],
  "address": {
    "street": "江南大道",
    "city": "上海",
    "state": "上海市"
  },
  "printInfo": function() {
    console.log(this.name + "的年龄是" + this.age + "岁,爱好是" + this.hobbies.join("、") + ",住在" + this.address.city + "市" + this.address.street);
  }
};

var jsonString = JSON.stringify(person);
console.log(jsonString);

运行以上代码后,会发现会报错如下所示:

TypeError: Converting circular structure to JSON

这是因为JSON序列化需要将对象的属性及其值都转换为字符串形式,而函数类型的值则无法转换为字符串。因此,如果需要序列化带有函数类型属性的对象,需要先手动将这些属性删除。

示例二

现在我们尝试将一个JSON字符串反序列化成JavaScript对象,并对其中的一些属性进行修改:

var jsonString = '{"name":"张三","age":20,"hobbies":["游泳","篮球"],"address":{"street":"江南大道","city":"上海","state":"上海市"}}';
var person = JSON.parse(jsonString);
console.log(person);

person.name = "李四";
person.age = 25;
person.hobbies.push("跑步");
person.address.city = "北京";

console.log(person);

运行以上代码后,可以看到第一个输出的结果是反序列化后的JavaScript对象,第二个输出的结果是修改后的JavaScript对象。

从以上两个示例中,我们可以看出JSON序列化与反序列化的基本使用方法,以及一些需要注意的细节。在实际开发中,JSON序列化与反序列化常被用于通过网络传输数据,或将数据存储到本地文件。

本文标题为:浅析JSON序列化与反序列化