JSON 备忘录

在此备忘录中,我们将介绍 JSON 备忘录,提供快速参考,帮助您理解和有效使用 JSON。 JSON(JavaScript 对象表示法)是一种轻量级的基于文本的数据交换格式,广泛用于 Web 开发,用于在服务器和客户端之间存储和传输数据。

目录

什么是 JSON?

JSON 全称是 JavaScript Object Notation。它是一种轻量级的数据交换格式,代表,它易于人类读写。读取和生成对机器很友好。 JSON 以标准方式用于在服务器和客户端之间传输信息。

主要功能

  • 基于文本的格式。
  • 很少,但很重要:独立于语言,但基于约定俗成的类似 C 语言(C、Java、Js、Python 等)
  • 最适合用于组织和将信息从一个地方移动到另一个地方。

基本 JSON

基本 JSON 是一种用于存储和交换数据的简单、人性化格式。它使用键值对结构来表示数据,使其易于在 Web 应用程序中的服务器和客户端之间传输。

平面对象

它们括在花括号 {} 中,包含键值对。

{ 
   "name": "Sam", 
   "age": 25, 
   "isMarried": false 
}

简单数组

数组是用方括号 [] 括起来的有序列表。

["Pineapple", "Blackberry", "Mango"]

具有单个数组的对象

JSON 中具有单个数组的对象由键值对组成,其中值是包含多个项目的数组。

{
    "hobbies": ["reading", "traveling", "swimming"]
}

键值对

JSON 中的键值对表示数据,其中每个键都是一个唯一标识符,值可以是字符串、数字、对象、数组或布尔值。

{ 
   "id": 101, 
   "status": "active" 
}

JSON 示例 1

{
   "superheroes": {
      "hero": [
         { "id": "1", "firstName": "Fast", "lastName": "Kick" },
         { "id": "2", "firstName": "Hawk", "lastName": "Storm" }
      ]
   }
}

JSON 示例 2

{
   "name": "Ram",
   "age": 23,
   "gender": "M",
   "salary": 40000,
   "married": true,
   "children": [
      { "name": "Sam", "age": 26, "gender": "M" },
      { "name": "Sita", "age": 18, "gender": "F" }
   ]
}

JSON 数据类型

以下是 JSON 格式支持的 数据类型

类型 插图 示例
数字 双精度浮点数 23, 40000, 0.5
字符串 用单引号括起来的一个或多个字符序列 "name": "Ram"
布尔值 真或假 true, false
数组 值的有序序列 ["a", "b", "c"]
对象 关联数组(例如存储)没有用于存储键/值对的隐式顺序。 "key": "value"
null 表示它是一个空值或未定义的值 null

特殊字符

该表显示了您可以在 JSON 文档的字符串中使用的各种特殊字符 −

字符串 插图
\" 双引号
\/ 正斜杠
\b 退格键
\ 反斜杠
\u Unicode 转义序列
换行符
\f 表格feed
回车符

Tab

数组

数组是用方括号括起来的有序列表,如下所示:[].

基本数组

["apple", "banana", "mango"]

2D 数组

2D 数组用于以矩阵格式,具有行和列,可以表示复杂的数据集,例如表格或网格。

{
   "my_sequences": [
      [1, 2, 3],
      [4, 5, 6],
      [7, 8, 9, 0],
      [10, 11]
   ]
}

对象数组

JSON 中的对象由键值对组成,其中值是包含多个项目的数组。

{
   "children": [
      { "name": "Jimmy Smith", "age": 15 },
      { "name": "Sammy Sosa", "age": 12 }
   ]
}

对象

JSON 对象 可以使用 JavaScript 创建。

嵌套对象

JSON 中的嵌套对象 指的是其他对象中的对象,允许复杂的数据结构。它们使用花括号 {} 定义,可以包含键值对,其中值也可以是对象或数组。

{
   "Alex": {
      "id": 7,
      "fullName": "Smith",
      "income": 30000,
      "hobbies": ["reading", "traveling"],
      "location": {
         "country": "X", 
         "city": "X-City"
      }
   }
}

数组对象

{
   "attributes": ["a1", "a2"],
   "methods": ["getter", "setter"],
   "empty_array": []
}

对象的对象

JSON 中的对象的对象是一种结构,其中键的值是另一个对象。这允许按层次结构组织数据,每个键指向一个嵌套对象。

{
   "Mark McGwire": {
      "hr": 65,
      "avg": 0.278
   },
   "Sammy Sosa": {
      "hr": 63,
      "avg": 0.288
   }
}

包含数组的对象

JSON 中包含数组的对象由键值对组成,其中值是数组。这些数组可以存储多个元素,例如字符串、数字或其他对象,从而实现结构化和灵活的数据表示。

{
   "features": ["feature1", "feature2"],
   "actions": ["read", "write"],
   "emptyList": []
}

包含对象的对象

{
   "Babe Ruth": {
      "homeRuns": 59,
      "average": 0.342
   },
   "Joe DiMaggio": {
      "homeRuns": 46,
      "average": 0.352
   }
}

访问 JSON 数据

访问 JSON 数据涉及使用键从对象或数组中检索值。在大多数编程语言中,可以使用点符号或括号符号来访问嵌套元素。

访问对象

在 JavaScript 中访问对象涉及使用点符号 (object.key) 或括号符号 (object["key"])。

let person = {
   "firstName": "Michael",
   "lastName": "Brown",
   "age": 34,
   "gender": "M",
   "income": 85000,
   "isMarried": true
};

person.firstName        // "Michael"
person["lastName"]      // "Brown"
person.age              // 34
person.other            // undefined
person[0]               // undefined

访问对象数组

要在 JavaScript 中访问对象数组,通常首先引用该对象,然后使用点或括号表示法访问其属性。

let myObj = {
   "name": "John",
   "age": 36,
   "married": true
};
console.log(myObj.name); // 输出:John
console.log(myObj.age); // 输出:36

访问数组

要访问数组中的元素,请使用元素的索引,从 0 开始。在提供的示例中,myArray[0] 访问第一个元素"John",myArray[3] 访问第四个元素 36。

let myArray = ["John", "Doe", 69000, 36, "M", true];
console.log(myArray[0]); // 输出:John
console.log(myArray[3]); // 输出:36

访问嵌套数据

要访问对象或数组中的嵌套数据,请使用点符号表示对象,使用数组索引表示数组。在您的示例中,myObj.tsmith[2] 从存储在 tsmith 键中的数组中访问第三个元素 (42)。

let myObj = {
   "ref": { "name": 0, "last": 1, "age": 2 },
   "jdoe": ["John", "Doe", 39],
   "tsmith": ["Tom", "Smith", 42]
};
console.log(myObj.ref.last); // 输出:1
console.log(myObj.tsmith[2]); // 输出:42

JSON 数字

JSON 格式支持以下数字类型 −

类型 示例
整数 {"value": 24>
负数 {"value": -8>
指数 {"value": 2.0E+3>
分数 {"value": 0.6
{"value": 0

语法和结构

以下是 JavaScript 中 JSON 的语法和结构 −

组件 说明 示例
数据对象 { 中的键值对 { "name": "Ram"
数据列表 [] 中的值 [ "cat", "dog" ]
键值对 键和值用 : 分隔 "city": "Kolkata"
文本值 双引号中的字符" "你好"
数字值 不带引号的数字 50, 2.15
逻辑值 布尔值 true 或 false。 true,false
空值 表示没有数据。 null
嵌入对象 另一个对象中的对象。 "address":{"city":"KL"
嵌入列表 另一个数组中的数组。 "nums":[[1, 2], [3, 4]]

解析技术

JSON 中的解析技术涉及使用 JSON.parse() 将 JSON 字符串转换为 JavaScript 对象,反之亦然,使用 JSON.stringify()。

基本解析

JSON 中的基本解析涉及使用 JSON.parse() 将格式正确的 JSON 字符串转换为 JavaScript 对象。

const obj = JSON.parse('{"name":"Ram", "age":25, "city":”Kolkata"}');
console.log(obj.name); // Output: Ram

解析 JSON 数组

解析 JSON 数组使用 JSON.parse() 完成,它将表示数组的 JSON 字符串转换为 JavaScript 数组。

const text = '["Ford", "BMW", "Ferrari", "TATA"]';
const myArr = JSON.parse(text);console.log(myArr[0]); // 输出:Ford

使用日期进行解析

手动转换

JSON.parse() 方法将 JSON 字符串转换为 JavaScript 对象。然后,使用 new Date() 将出生属性(字符串)手动转换为 Date 对象。

const text = '{"name":"Sam", "birth":"2000-01-19",
"city":"Hyderabad"}';const obj = JSON.parse(text);obj.birth = new Date(obj.birth);console.log(obj.birth); // 输出:日期对象

处理函数

处理 JSON 中的函数涉及解析存储为字符串的函数定义,并使用 eval() 等技术将其转换回可执行函数

const text = '{"name":"Sam", "age":"function () {return 24;}", "city":"Hyderabad"}';
const obj = JSON.parse(text);
obj.age = eval("(" + obj.age + ")");
console.log(obj.age()); // 输出:24

验证

以下是 JSON 中的验证方法 −

方法 描述 示例代码
JSON.parse 检查字符串是否为有效的 JSON。如果无效,则抛出错误。 try { JSON.parse(jsonStr); console.log("有效的 JSON"); } catch (e) { console.log("无效的 JSON");
ajv.validate 使用 Ajv 根据模式验证 JSON 数据。 const Ajv = require("ajv"); const ajv = new Ajv(); const valid = ajv.validate(schema, data);
isJSON(自定义) 自定义函数用于验证 JSON 而不产生异常。 const isJSON = (str) => { try { JSON.parse(str); return true; } catch { return false; } };

性能优化

以下是 JavaScript 中 JSON 的性能优化策略 -

策略 操作 语法
最小化 JSON 大小
  • 删除不必要的空格和换行符。
  • 使用较短的键名。
  • 使用 Brotli/Gzip 压缩 JSON。
const compactJson = JSON.stringify(data);

示例:{"name":"Ram","age":22}
高效解析 JSON
  • 使用 JSON.parse() 代替 eval()。
  • 利用现代 JavaScript 引擎中的内置解析功能。
  • 对大型有效负载实施惰性/增量解析。
const parsedData = JSON.parse(jsonString);

示例:JSON.parse('{"name":"Ram"}')
缓存 JSON数据
  • 将 JSON 响应存储在 localStorage、sessionStorage 或 IndexedDB 中。
  • 使用服务工作线程进行离线缓存。
localStorage.setItem('jsonData', JSON.stringify(data));

示例:localStorage.getItem('jsonData')