JSON:让数据传输更优雅

news2024/11/26 10:00:45

在东南亚海滩的阳光下,时而有一些贝壳、手工艺品等迷人的商品吸引着你。然而,语言的障碍有时会成为购买商品的阻碍。不得不用手比划以及尝试各种办法来进行交流。幸运的是,人们找到原始沟通的技巧,让彼此都能接受的信息交流方式:在沙滩上用脚画数字。

图片

商家在沙滩上细心绘制商品的价格,游客仔细观察,并以图形的方式表达自己的意愿。如果商家同意,他会点头或用手势表示接受;如果不同意,他会擦掉所画的数字,并用新的数字来表示自己的心理价位。通过几轮互动,双方逐渐接近对价格的共识,最终达成交易,这一切既有趣又高效。

图片

在编程中,前后端为了确保双方能够顺利传递信息,需要约定一种信息交换的方式。其中JSON作为一种轻量级、易读写的数据格式,就像在沙滩上画数字一样,成为了前后端信息交互的默契方式。通过约定好的JSON数据结构,请求和响应双方能够更加高效地交换信息,实现信息的无缝传递。

那么,JSON就是信息交换所使用的的一种数据格式。

常见的数据交互的格式

常见的数据交互格式包括纯文本、XML、JSON等不同结构,让我们分别来看一下它们之间的区别。

1.  纯文本格式

    ● 竖线分割的(姓名|性别|地址|年龄|手机号)

张三|男|沙阳路18号北京科技职业学院内|23|13333335555
婉儿|女|大连设计城901|22|13333336666

    ● 逗号分割的(姓名,性别,地址,年龄,手机号)

张三,男,沙阳路18号北京科技职业学院内,23,13333335555
婉儿,女,大连设计城901,22,13333336666

2.  XML格式

<students>
    <student>
        <name>张三</name>
        <gender>张三</gender>
        <addr>沙阳路18号北京科技职业学院内</addr>
        <age>23</age>
        <phone>13333335555</phone>
    </student>
    <student>
        <name>张三</name>
        <gender>张三</gender>
        <addr>沙阳路18号北京科技职业学院内</addr>
        <age>23</age>
        <phone>13333335555</phone>
    </student>
</students>

3.  JSON格式

{
    "students": [
        {
            "name": "张三",
            "gender": "张三",
            "addr": "沙阳路18号北京科技职业学院内",
            "age": 23,
            "phone": "13333335555"
        },
        {
            "name": "张三",
            "gender": "张三",
            "addr": "沙阳路18号北京科技职业学院内",
            "age": 23,
            "phone": "13333335555"
        }
    ]
}

各种格式的对比

1.  文本格式

    a.  优点:内容简洁,传输数据量少

    b.  缺点1:无法适应复杂的业务变化,例如后端将电话与年龄调换位置,前端如果不调整数据就会错乱

    c.  缺点2:不支持有层级结构的,层级结构下面会展开讲解

    d.  缺点3:如果数据中包含竖线,解析时就会出现数据错乱,例如“张三|男|沙阳路18号北京科技职业学院内|23|13333335555”中的地址信息改为“张三|男|沙阳路18号北京科技职业学院内-服务楼2|3|4层|23|13333335555”,解析时就会多出来很多个字段

2.  xml格式

    a.  优点1:格式清晰,顺序可调整,后端新增项也不影响前端

    b.  优点2:支持层级结构

    c.  优点3:数据内容与标签相同时可进行转义

原文:“<addr>中国>北京>昌平>沙河>千锋教育</addr>”
转义为:“<addr>中国>北京>昌平>沙河>千锋教育</addr>”

    d.  缺点1:数据传输量大,是文本的好几倍,属性描述字段需要有开始和结束标签,例如:“<name>张三</name>”

3.  json格式

    a.  优点1:格式清晰,顺序可调整,后端新增项不会影响影响前端

    b.  优点2:支持层级结构(后面展开说)

    c.  优点3:数据内容与标签相同时可进行转义

原始内容:"addr":"中国北京昌平沙河"千锋教育""
转义后:"addr":"中国北京昌平沙河\"千锋教育\""

    d.  优点4:数据传输量适当,属性描述字段不需要有闭合标签,例如:“name:"张三"”

展开说说JSON?

JSON,即JavaScript Object Notation,直译是js对象标记。是一种轻量级的数据交换格式,它由键值对组成,用于表示结构化的数据

既然咱们展开说就说的直白一点,JSON的是由js当中的对象数据类型演化而来,用于描述某种对象的属性和值的,并且具有上级结构,为了方便传输,把这种数据改造为字符串,诶,这不就来了吗,js对象数据类型如下:

//某个人
const person= {
    name:'张三',
    age:19,
    phone:'13333335555',
    addr:'国家省市县'
}
//省市县的对象,树状的层级结构
const addr = {
  "name": "中国",
  "type": "country",
  "children": [
    {
      "name": "北京市",
      "type": "province",
      "children": [
        {
          "name": "北京市",
          "type": "city",
          "children": [
            { "name": "东城区", "type": "county" },
            { "name": "西城区", "type": "county" },
            { "name": "朝阳区", "type": "county" },
            { "name": "海淀区", "type": "county" }
          ]
        }
      ]
    },
    {
      "name": "上海市",
      "type": "province",
      "children": [
        {
          "name": "上海市",
          "type": "city",
          "children": [
            { "name": "黄浦区", "type": "county" },
            { "name": "徐汇区", "type": "county" },
            { "name": "闵行区", "type": "county" },
            { "name": "宝山区", "type": "county" }
          ]
        }
      ]
    }
  ]
}

但,这是js的对象数据类型,数据类型本质是内存中存储数据的方式,我们不可能把内存传输给后台。

图片

不能传输内存,那就转为字符串传递呗,按照对象数据类型的这个结构,变为字符串格式的,这多清晰明了,数据量也不是很大,又能很好兼顾层级结构(省市县const addr),说干就干,于是我们转为下面这个样子:

let addrJSONString = `{
  "name": "中国",
  "type": "country",
  "children": [
    {
      "name": "北京市",
      "type": "province",
      "children": [
        {
          "name": "北京市",
          "type": "city",
          "children": [
            { "name": "东城区", "type": "county" },
            { "name": "西城区", "type": "county" },
            { "name": "朝阳区", "type": "county" },
            { "name": "海淀区", "type": "county" }
          ]
        }
      ]
    },
    {
      "name": "上海市",
      "type": "province",
      "children": [
        {
          "name": "上海市",
          "type": "city",
          "children": [
            { "name": "黄浦区", "type": "county" },
            { "name": "徐汇区", "type": "county" },
            { "name": "闵行区", "type": "county" },
            { "name": "宝山区", "type": "county" }
          ]
        }
      ]
    }
  ]
}`
//注意,我使用了反引号,这样的数据字符串可以换行

JSON的组成

    ● 大括号 {}:用于表示对象的开始和结束,对象是由一组无序的键值对组成的。
    ● 方括号 []:用于表示数组的开始和结束,数组是由一组有序的值组成的。  
    ● 冒号 ::用于分隔键和值,将键与对应的值关联在一起。
    ● 逗号 ,:用于分隔数组或对象中的不同键值对或值,将它们分开。
    ● 双引号 " 或单引号 ':用于包围字符串,表示字符串的开始和结束。
    ● 反斜杠 \:用于转义特殊字符,确保特殊字符的正确解析。

写到最后:JSON的优雅之处

    ● 数据体积JSON通常比XML更小巧。由于JSON采用了简洁的语法,不需要像XML那样添加大量的标签和属性,因此JSON的数据体积相对较小。这使得JSON在网络传输中消耗的带宽更少,有利于提高数据传输的效率。

    ● 语法复杂性:相比较而言,XML的语法相对复杂一些。XML需要使用起始标签和结束标签来包裹数据,而JSON只需要使用花括号 {} 和方括号 [] 就可以表示对象和数组。这使得JSON的语法更加简洁和易读。

    ● 解析效率:由于JSON的语法相对简单,它的解析速度通常比XML更快。这对于大规模数据的处理和解析非常重要,尤其在需要实时响应的应用场景下。

    ● 兼容性:JSON在前端和后端的兼容性较好。几乎所有主流编程语言都有JSON的解析和序列化库,这使得JSON在前后端交互时更为便捷。

    ● 可读性:JSON相对于XML更易读写。JSON的结构类似于JavaScript对象,使得开发者能够更直观地理解数据结构,便于调试和开发。

    ● 扩展性:尽管XML在一些特定领域具有更好的扩展性,但对于一般的树形数据结构,JSON的扩展性也是足够的。JSON支持嵌套对象和数组,可以灵活地表示复杂的数据结构。

    综上所述,JSON在处理省市县和汽车等树形数据结构时具有更小的数据体积、更简洁的语法、更快的解析效率和更好的兼容性等优势。这些优势使得JSON成为处理树形数据结构的首选数据格式,尤其在现代Web应用和移动应用中广泛应用。然而,对于一些特定需求,XML仍然可能是更好的选择,比如需要更复杂结构和更强的扩展性的场景。

- End -

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

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

相关文章

ES6 - 对象新增的一些常用方法

文章目录 1&#xff0c;Object.is()2&#xff0c;Object.asign()3&#xff0c;Object.getOwnPropertyDescriptors()4&#xff0c;Object.setPrototypeOf()和getPrototypeOf()5&#xff0c;Object.keys()、values() 和 entries()6&#xff0c;Object.fromEntries()7&#xff0c;…

高效构建 vivo 企业级网络流量分析系统

作者&#xff1a;vivo 互联网服务器团队- Ming Yujia 随着网络规模的快速发展&#xff0c;网络状况的良好与否已经直接关系到了企业的日常收益&#xff0c;故障中的每一秒都会导致大量的用户流失与经济亏损。因此&#xff0c;如何快速发现网络问题与定位异常流量已经成为大型企…

在Gazebo中添加悬浮模型方法 / Gazebo中模型如何不因重力下落:修改sdf、urdf模型

目录 一、问题描述&#xff1a; 二、解决方法&#xff1a; 2.1 SDF模型&#xff1a; 2.2 URDF模型&#xff1a; 2.3 测试添加模型 三、通过Python程序在Gazebo中添加模型 一、问题描述&#xff1a; 在使用ros做仿真实验时&#xff0c;有时会需要在空间中添加一个模型文件…

1——Hive数仓项目完整流程(在线教育)

目录 前言 一、项目架构 二、软件相关作用 1.大数据相关软件 2.数仓 2.1数据仓库与数据库 2.2数据仓库和数据集市 2.3维度分析 2.4指标 3.数仓建模 3.1建模理论 3.2维度建模 3.3维度建模的三种模型 3.4缓慢渐变维 总结 前言 本专栏以大数据实战“在线教育项目”为导向系…

SAP 动态编程-动态获取结构字段对象(类模式)

实施方法 GET_DYNAMIC_FIELD_OBJECT 参数 代码 DATA: lt_source TYPE TABLE OF string.DATA: lv_name TYPE sy-repid VALUE ZTEMP_GET_DYNAMIC_OBJECT,lv_form(30) TYPE c VALUE FRM_GENERATE_OBJECT,lv_message(240) TYPE c,lv_line TYPE i,lv_word(72…

JVM GC ROOT分析

GC root原理:通过对枚举GCroot对象做引用可达性分析,即从GC root对象开始,向下搜索,形成的路径称之为 引用链。如果一个对象到GC roots对象没有任何引用,没有形成引用链,那么该对象等待GC回收,换而言之,如果减少内存泄漏,也就是切断引用链,常见的GCRoot对象如下: 1、…

基于双端口RAM的乒乓操作测试

文章目录 前言一、乒乓操作简介二、双端口RAM配置三、RAM控制模块设计四、乒乓操作验证 前言 本文将介绍基于双端口RAM的乒乓操作测试&#xff0c;并探索如何在AWC_C4MB开发板上实现这一测试。双端口RAM作为一种性能出色且功能强大的存储器设计&#xff0c;为我们提供了并发访问…

PCB布线当中的地线和电源线的规划和处理

在PCB布线中&#xff0c;地线和电源线的规划和布局非常重要&#xff0c;可以影响电路的稳定性、抗干扰能力和信号质量。下面是一些常见的规划和布局建议&#xff1a; 分离地平面&#xff1a;将地线分为模拟地和数字地两个区域&#xff0c;并使用两个独立的地平面来布线。这样可…

MySql007——检索数据:排序检索数据(ORDER BY的使用)

前提&#xff1a;使用《MySql006——检索数据&#xff1a;基础select语句》中创建的products表 一、抛出问题 如果我们向获得products表中所有商品名称和价格&#xff0c;可以这些检索数据 SELECT prod_name, prod_price FROMproducts;但是发现这些价格是乱序的&#xff0c;…

【计算机视觉 | 图像分割】arxiv 计算机视觉关于图像分割的学术速递(7 月 28 日论文合集)

文章目录 一、分割|语义相关(6篇)1.1 To Adapt or Not to Adapt? Real-Time Adaptation for Semantic Segmentation1.2 Towards Deeply Unified Depth-aware Panoptic Segmentation with Bi-directional Guidance Learning1.3 Semantic Image Completion and Enhancement usin…

PTC Preo creo弹出框 重新获得许可 取消弹出框方法

问题&#xff1a;打开proe软件之后&#xff0c;在使用时&#xff0c;会有【重新获得浮动许可证】的弹出框提示 解决办法&#xff1a; 1.重新打开proe 2.配置proe参数&#xff0c;Proe打开软件&#xff0c;打开选项 Proe用好多版本&#xff0c;打开的界面都不一样&#xff0c…

一零六六、线程池、锁

线程池&#xff1a; 管理线程创建&#xff0c;销毁的一系列池子 如何创建线程池&#xff1f; ExecutorService executor Executors.newFixedThreadPool(n); 创建线程有多种方法&#xff0c;为何要用线程池&#xff1f; 减少性能开销,每次执行任务都新建线程造成cpu资源浪费…

【雕爷学编程】Arduino动手做(181)---Maixduino AI开发板11

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

低代码平台的使用学习

背景 最近发现老婆每天都要捣鼓一个 excel 表格&#xff0c;并将表格发到群中&#xff0c;询问后才知道只是为了记录每天的事物变化。我想这接收方每次都要下载表格再打开看&#xff0c;太麻烦了&#xff0c;直接做个 web 表单&#xff0c;支持简单的增删改查就好了。 当我着…

Talk | ICCV‘23 华南理工大学林炜丰:视觉基础模型-尺度卷积调制遇上Transformer

本期为TechBeat人工智能社区第519期线上Talk&#xff01; 北京时间8月3日(周四)20:00&#xff0c;华南理工大学—林炜丰的Talk已准时在TechBeat人工智能社区开播&#xff01; 他与大家分享的主题是: “视觉基础模型-尺度卷积调制遇上Transformer”&#xff0c;他介绍了一种新的…

Godot 4 源码分析 - 碰撞

碰撞功能应该是一个核心功能&#xff0c;它能自动产生相应的数据&#xff0c;比如目标对象进入、离开本对象的检测区域。 基于属性设置&#xff0c;能碰撞的都具备这样的属性&#xff1a;Layer、Mask. 在Godot 4中&#xff0c;Collision属性中的Layer和Mask属性是用于定义碰撞…

在线文档协作工具有哪些推荐?

在现代工作和学习中&#xff0c;团队协作的重要性日益凸显。随着云计算和互联网技术的快速发展&#xff0c;越来越多的在线协作工具涌现出来&#xff0c;为我们提供了高效、便捷的协作方式。我根据日常工作经验&#xff0c;向大家推荐3款主流、且备受欢迎的在线协作工具&#x…

AI绘图实战(十二):让AI设计LOGO/图标/标识 | Stable Diffusion成为设计师生产力工具

S&#xff1a;AI能取代设计师么&#xff1f; I &#xff1a;至少在设计行业&#xff0c;目前AI扮演的主要角色还是超级工具&#xff0c;要顶替&#xff1f;除非甲方对设计效果无所畏惧~~ 预先学习&#xff1a; 安装及其问题解决参考&#xff1a;《Windows安装Stable Diffusion …

用C语言构建一个数字识别卷积神经网络

卷积神经网络的原理和对应的python例子参见: https://victorzhou.com/blog/intro-to-cnns-part-1/ 和...-2/ 这里仅叙述卷积神经网络的配置, 其余部分不做赘述&#xff0c;具体请参见上一篇: 用C语言构建一个手写数字识别神经网路 卷积网络同样采用简单的三层结构&#xff0c…