聊聊JSON

news2025/1/16 17:43:16

引言

JSON的概念

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它基于JavaScript的一个子集,但独立于语言,这意味着它可以被许多编程语言轻松解析。JSON的简洁性和易读性使其成为Web开发中数据交换的首选格式。

Web开发中的重要性

在Web开发中,JSON扮演着至关重要的角色。它被广泛用于:

  • 前后端通信:作为APIs的数据交换格式,允许Web应用程序与服务器交换复杂的数据结构。
  • 配置文件:存储应用程序的配置信息,如设置和偏好。
  • 数据存储:在某些情况下,JSON也用作轻量级数据库的存储格式。
  • Web组件:现代Web组件和框架经常使用JSON来定义组件的属性和状态。
为什么开发者需要了解JSON

开发者需要了解JSON,原因包括:

  • 普遍性:几乎所有现代Web应用程序都使用JSON,了解它有助于更好地与这些应用交互。
  • 数据交换:JSON是前后端通信的标准,掌握它有助于开发者构建更加灵活和可扩展的Web服务。
  • 跨语言支持:由于JSON的跨语言特性,开发者可以使用熟悉的语言来生成和解析JSON数据。
  • 工具和库:许多编程语言和框架提供了处理JSON的工具和库,了解JSON有助于更有效地使用这些工具。
  • 性能优化:JSON通常比XML等其他数据格式更小、更快,了解如何优化JSON数据的传输和解析可以提升应用性能。
  • 现代Web技术:随着RESTful API、GraphQL和微服务架构的兴起,JSON的使用变得更加频繁。

JSON基础

定义JSON

JSON(JavaScript Object Notation)是一种用于数据交换的文本格式,它使用JavaScript的语法规则来表示数据对象。尽管JSON基于JavaScript,但它是语言无关的,这意味着任何能够解析文本的编程语言都可以使用JSON。

基本结构

JSON数据由两种基本结构组成:对象和数组。

  • 对象:无序的键值对集合。在JSON中,对象由花括号 {} 包围,键值对之间用逗号 , 分隔。
  • 数组:有序的数据集合。在JSON中,数组由方括号 [] 包围,数组中的元素也是用逗号 , 分隔。
键值对

键值对是JSON对象中的基本元素,键是一个字符串,用双引号包围,后面跟着一个冒号 :,然后是它的值。例如:

{

"name": "John Doe",

"age": 30

}

数据类型

JSON支持以下几种数据类型:

  • 字符串:用双引号包围的文本,例如 "hello"
  • 数字:不需要引号的数值,例如 42 或 3.14
  • 对象:由键值对组成的集合,例如 { "key": "value" }
  • 数组:有序的数据列表,例如 [1, 2, 3]
  • 布尔值:逻辑值 true 或 false
  • null:表示空值的特殊关键字。
语法规则

以下是一些JSON的基本语法规则:

  • 所有键都必须用双引号包围。
  • 字符串值也必须用双引号包围。
  • 数字不能含有引号,且必须表示为有效的数字。
  • 布尔值和null关键字不区分大小写。
  • 数组和对象内部的元素必须用逗号分隔。
  • 数组和对象可以相互嵌套。
示例

以下是一个更复杂的JSON示例,展示了多种数据类型和结构:

在这个示例中,我们定义了一个包含不同数据类型的对象,包括字符串、数字、布尔值、数组、嵌套对象和null值。

JSON与JS

交互概述

JSON与JavaScript的交互是通过内置的JSON对象实现的。这个全局对象提供了两个方法:JSON.parse()JSON.stringify(),使得JavaScript能够轻松地与JSON数据格式进行转换。

JSON.parse() 方法

JSON.parse() 方法用于将JSON字符串转换为JavaScript对象。这个过程称为解析(parsing)。当你从API或其他源接收到JSON格式的数据时,可以使用这个方法来转换数据,以便在JavaScript中使用。

语法:

JSON.parse(jsonString[, reviver]);
  • jsonString 是一个有效的JSON字符串。
  • reviver 是一个可选的函数,用于在解析过程中对值进行变换。

示例:

JSON.stringify() 方法

JSON.stringify() 方法用于将JavaScript对象或值转换为JSON字符串。这个过程称为序列化(serialization)。当你需要发送数据到服务器或其他客户端时,可以使用这个方法来转换JavaScript对象。

语法:

JSON.stringify(value[, replacer [, space]]);
  • value 是要转换的JavaScript对象或值。
  • replacer 是一个可选的函数或数组,用于过滤要序列化的属性。
  • space 是一个可选的数值或字符串,用于美化输出的空白字符数,增强可读性。

示例:

深度解析和序列化
  • JSON.parse() 和 JSON.stringify() 都能够处理复杂的嵌套对象和数组。
  • 这两个方法都是递归的,可以处理任意深度的嵌套结构。
注意事项
  • JSON.parse() 只能解析有效的JSON字符串。如果字符串格式不正确,会抛出 SyntaxError
  • JSON.stringify() 在序列化时会忽略 undefined、函数和循环引用。
  • 使用 replacer 函数时,可以控制哪些属性被包含或排除在序列化的结果中。

其中replace比较难以理解,我们单独拎出来

replacer 参数的作用

replacer 参数在 JSON.stringify() 方法中用于控制哪些属性被包含在最终的JSON字符串中,以及如何修改它们的值。这可以通过两种方式实现:使用函数或数组。

使用 replacer 函数

replacer 是一个函数时,该函数将为对象中的每个属性被调用一次,参数为键名和对应的属性值。

  • 键名 (key):当前遍历到的属性名称。
  • 属性值 (value):当前遍历到的属性值。

函数应该返回一个值,这个值将作为序列化后的属性值。如果返回 undefined,则该属性将被排除在序列化结果之外。

示例:

replacer 是一个数组时,只有数组中列出的属性名才会被包含在序列化后的JSON字符串中。

示例:

在这个例子中,只有 nameage 属性被包含在序列化后的字符串中,address 属性被排除了。

注意事项

  • 当使用 replacer 函数时,它不会递归地应用于嵌套对象。如果你需要过滤嵌套对象,必须在 replacer 函数内部处理。
  • replacer 函数主要用于实现自定义的序列化逻辑,比如排除某些属性、转换属性值的类型等。
  • 使用 replacer 数组可以很方便地控制序列化结果中包含哪些顶层属性。

JSON的应用场景

Web API

在Web API中,JSON是数据交换的主要格式之一。由于其简洁和易于解析的特点,JSON非常适合用于API响应和请求数据的格式。

  • RESTful API:在REST(Representational State Transfer)架构风格中,JSON常用于资源的表述,使得客户端可以通过HTTP方法获取或修改资源状态。
  • GraphQL API:GraphQL允许客户端明确指定所需数据的结构,返回的也是JSON格式,这使得数据获取更加灵活和高效。
配置文件

JSON因其清晰的结构和易于编辑的特性,常被用作配置文件的格式。

  • 开发配置:项目中可能会有多个环境(开发、测试、生产),JSON文件可用于存储不同环境下的配置参数。
  • 依赖管理:在一些包管理工具中,如npm或yarn,package.json 文件使用JSON格式定义了项目的依赖关系和其他元数据。
主题设置

在一些应用或框架中,用户可以自定义主题或界面设置,这些设置可以存储在JSON文件中。

  • 用户界面定制:应用可以允许用户自定义颜色方案、字体大小等,并将这些偏好设置保存在JSON文件中。
  • 国际化:多语言应用可能会使用JSON来存储不同语言的翻译字符串。
前后端数据交换

JSON在前后端开发中扮演着核心角色,尤其是在数据交换方面。

  • 异步数据加载:使用AJAX或现代的Fetch API,前端应用可以异步请求数据,并以JSON格式接收响应,从而无需重新加载页面即可更新内容。
  • WebSocket通信:实时应用可能会使用WebSocket协议进行双向通信,JSON同样常用于这种场景下的消息格式。
  • 前端路由:在单页应用(SPA)中,前端路由的状态或参数有时会以JSON格式传递和处理。
微服务架构

在微服务架构中,服务间的通信通常使用轻量级的消息传递格式,JSON因其轻量和易于使用而成为首选。

缓存和存储

JSON格式的数据可以被轻松地序列化和反序列化,这使得它适合用于缓存机制或本地存储。

  • 浏览器缓存:应用可以将一些数据缓存到本地,如使用localStoragesessionStorage,这些数据通常以JSON格式存储。
  • 服务端缓存:服务端也可以使用JSON格式缓存数据,以减少数据库查询或外部API调用。
第三方服务集成

许多第三方服务和API(如社交媒体、支付网关等)提供JSON格式的接口,使得开发者可以轻松集成这些服务到自己的应用中。

结语

随着本文对JSON的深入剖析,我们可以看到JSON不仅仅是现代Web开发中的一个数据格式,它更是一种连接不同系统、服务和组件的桥梁。JSON的简洁性、灵活性和语言无关性,使其成为数据交换和配置管理的理想选择。

通过 JSON.parse()JSON.stringify(),JavaScript与JSON的交互变得自然而直观,为开发者提供了强大的工具来处理和转换数据。而 replacer 参数的巧妙使用,更是在序列化过程中提供了额外的控制力,帮助我们根据需要定制数据的表现形式。

在Web API设计、配置文件管理、主题个性化设置、前后端数据交互、微服务架构通信、数据缓存策略以及第三方服务集成等方面,JSON都发挥着至关重要的作用。随着技术的持续进步,JSON的应用场景也在不断扩展,其重要性日益增加。

我们鼓励开发者继续探索JSON的更多可能性,利用它来提升应用的性能、增强用户体验,并构建更加健壮和可扩展的Web解决方案。随着对JSON深入理解的不断加深,我们相信开发者将能够更有效地应对当下及未来Web开发中的挑战。

感谢您阅读本文,希望本文能为您在Web开发之旅中提供有价值的见解和实用的指导。期待在接下来的实践中,您能将所学知识运用到创新的项目中,不断推动Web技术的发展。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1848420.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

煤矿智能巡检机器人:推动煤矿行业变革的关键力量

目前我国煤炭资源总量达到了2078.85亿吨,已探明储量为1432亿吨,煤矿能源现阶段还是我国重要的基础能源。而煤矿生产作业存在巨大危险,主要包括高温、高压、燃爆和有毒气体等环境因素,同时机械设备运转过程中潜藏着重大风险。这些危…

MySQL 核心模块揭秘 | 21 期 | 行锁 (1) 快速加锁

行锁有两种加锁逻辑,这一期我们聊聊其中之一的快速加锁。 作者:操盛春,爱可生技术专家,公众号『一树一溪』作者,专注于研究 MySQL 和 OceanBase 源码。 爱可生开源社区出品,原创内容未经授权不得随意使用&a…

【深海王国】小学生都能做的APP?AppInventor、BLE蓝牙、Arduino联合开发你的第一个手机远程控制程序(7)

Hi~ (o^^o)♪, 各位深海王国的同志们,早上下午晚上凌晨好呀~ 辛勤工作的你今天也辛苦啦(/≧ω) 今天大都督依旧为大家带来小学生都能学会的APP制作教程,帮你一周内快速开发一款可以和单片机无线通讯的手机蓝牙APP,let’s go! &a…

Python13 时间格式转换

在Python中,时间格式转换通常指的是将日期和时间数据从一种表示形式转换成另一种。这种转换经常使用Python的datetime和time模块来实现。这些模块提供了多种工具,可以帮助用户将时间表示为字符串、时间戳,或是更加结构化的datetime对象等多种…

Android-Framework:Handler全解析,看完这篇还不懂请给我寄刀片

//【1】拿到队列头部 Message p mMessages; boolean needWake; //【2】如果消息不需要延时&#xff0c;或者消息的执行时间比头部消息早&#xff0c;插到队列头部 if (p null || when 0 || when < p.when) { // New head, wake up the event queue if blocked. msg.next…

下班时间如何安排?

随着互联网的飞速发展和数字化时代的来临&#xff0c;越来越多的人开始探索除了主业以外的赚钱途径&#xff0c;以增加收入来源。本文将为您介绍几种当前热门的高薪副业项目&#xff0c;包括网络任务赚钱、开设个人网店、电商导购推广、在线辅导教学、技能变现服务、视频创作分…

探索C嘎嘎的奇妙世界:第十六关---STL(vector的练习)

1.只出现一次的数字 我们可以使用异或运算来解决这个问题&#xff1a; 异或运算有一个重要的性质&#xff1a;两个相同的数进行异或运算结果为 0&#xff0c;任何数与 0 异或结果为其本身。对于数组中的元素&#xff0c;依次进行异或运算&#xff0c;出现两次的元素异…

任务调度框架革新:TASKCTL在Docker环境中的高级应用

Docker&#xff1a;轻量级容器化技术的魅力 Docker 作为一款开源的轻量级容器化技术&#xff0c;近年来在 IT 界掀起了一股热潮。它通过封装应用及其运行环境&#xff0c;使得开发者可以快速构建、部署和运行应用。Docker 的优势在于其轻量级、可移植性和可扩展性&#xff0c;它…

店员顾客起纠纷?EasyCVR+AI视频监控管理平台,助力连锁门店安全运营

近日&#xff0c;某品牌咖啡店店员与顾客起冲突登上了新闻热搜&#xff0c;一时间引发大量关注。随着门店完整的监控视频录像公开&#xff0c;大家才了解事情的原委&#xff0c;而并非网传的那样。 随着社会的进步和科技的发展&#xff0c;视频监控已成为各行各业不可或缺的安全…

教你开发一个适合外贸的消息群发工具!

在全球化日益加速的今天&#xff0c;外贸业务已经成为许多企业不可或缺的一部分&#xff0c;而在外贸业务中&#xff0c;高效的消息群发工具则扮演着至关重要的角色。 它能够帮助企业快速、准确地传达产品信息、促销活动等重要内容&#xff0c;从而提升业务效率和客户满意度&a…

vben admin BasicTable表格基本使用

vben admin是一款强大的后台管理系统&#xff0c;广泛应用于各种项目中。本文将为您详细介绍如何使用 便您更快地上手并充分发挥其功能。 Table 表格 | Vben Admin一个开箱即用的前端框架https://jeesite.com/front/vben-admin/docs/components/table.html#usage 1.register:…

用类来实现输入和输出时间(时:分:秒)

编写程序&#xff1a; 运行结果&#xff1a; 程序分析&#xff1a; 这是一个很简单的例子。类Time中只有数据成员&#xff0c;而且它们被定义为公用的&#xff0c;因此可以在类的外面对这些成员进行操作。t1被定义为Time类的对象。在主函数中向t1对象的数据成员输入用户…

【ai】tx2-nx:Yolo V4 直接安装与 测试

Yolo V4环境搭建 git clone https://github.com/AlexeyAB/darknet.gitcuda版本和路径也要改成我们的实际版本和路径,否则会编译失败 编译 sudo make nvidia@tx2-nx:~/twork/02_yolov4/darknet$ vi Makefile nvidia@tx2-nx:~/twork/02_yolov4/darknet$ sudo make [sudo

从起心动念上,做个好人,好人好自己(阳明心学)

人心中的天理终究不会泯灭&#xff0c;每个人心中本来就有良知&#xff0c;良知是与生俱来的。 起心动念决定了意识、语言和行为&#xff0c;而这些意识、语言和行为又决定了事事物物&#xff0c;事事物物连接起来就是我们的人生。 让自己不断产生更好的念头&#xff0c;坚持…

拿下PostgreSQL中级认证PCP,现在它是我简历上的亮点了!

作者&#xff1a;IT邦德 中国DBA联盟(ACDU)成员&#xff0c;10余年DBA工作经验&#xff0c; Oracle、PostgreSQL ACE CSDN博客专家及B站知名UP主&#xff0c;全网粉丝10万 擅长主流Oracle、MySQL、PG、高斯及Greenplum备份恢复&#xff0c; 安装迁移&#xff0c;性能优化、故障…

小红书点赞评论收藏【更新版本】

小红书作为社交媒体的一个亮点&#xff0c;其点赞、评论和收藏的功能形成了一种特有的交流机制。点赞简直就是一枚迷你奖章&#xff0c;为创作者带去信心与动力。一次点赞&#xff0c;表达的是你心中无言的喜好和认可&#xff1b;它如明亮的灯塔&#xff0c;在汪洋大海中为创作…

史上最全的整合Harbor安装教程,哈哈哈哈

一、安装docker 下载地址&#xff1a;https://download.docker.com/linux/static/stable/x86_64/docker-23.0.4.tgz 1.1 解压二进制包 wget https://download.docker.com/linux/static/stable/x86_64/docker-23.0.4.tgz tar zxvf docker-23.0.4.tgz mv docker/* /usr/bin1.2…

JavaWeb阶段学习知识点(一)

【参考视频】https://www.bilibili.com/video/BV1m84y1w7Tb?p=167&vd_source=38a16daddd38b4b4d4536e9c389e197f SpringBoot项目的创建和接口配置 做一个springboot项目,从创建项目到实现浏览器访问localhost:8080/hello返回字符串hello world的全流程 1. 创建项目 idea新…

2-12 基于CV模型卡尔曼滤波、CT模型卡尔曼滤波、IMM模型滤波的目标跟踪

基于CV模型卡尔曼滤波、CT模型卡尔曼滤波、IMM模型滤波的目标跟踪。输出跟踪轨迹及其误差。程序已调通&#xff0c;可直接运行。 2-12 CV模型卡尔曼滤波 CT模型卡尔曼滤波 - 小红书 (xiaohongshu.com)

memory动态内存管理学习之shared_ptr

此头文件是动态内存管理库的一部分。std::shared_ptr 是一种通过指针保持对象共享所有权的智能指针。多个 shared_ptr 对象可持有同一对象。下列情况之一出现时销毁对象并解分配其内存&#xff1a; 最后剩下的持有对象的 shared_ptr 被销毁&#xff1b;最后剩下的持有对象的 s…