JSON 是什么?为什么很多软件用它传递数据?

IT那些事2026-10-02发布 WarpEdit
464 0 0

商品页面显示的名称、价格、颜色和库存,服务器怎样交给手机或网页?JSON 可以把这些资料写成一份有规则的文本,让接收方按字段找到需要的值。它是一种组织和交换数据的格式,规则较少,能表达有层次的资料,许多编程语言也支持读取和生成,所以软件之间常用它传递数据。

手绘帆布包和JSON资料卡,展示名称、价格和有货状态按字段组织

把商品资料写成 JSON

假设我们要传递一款帆布包的资料。下面是一份用于解释的 JSON,商品和数值都是示意,价格在这个例子里约定以元计:

{
  "name": "帆布包",
  "price": 59,
  "in_stock": true,
  "colors": ["米色", "蓝色"],
  "size": {"width_cm": 30, "height_cm": 35},
  "discount": null
}

"name": "帆布包" 中,冒号左边是名字,也叫键或字段名,右边是值。双方约定 name 表示商品名称,接收方就能直接取出“帆布包”,无需从一段介绍里猜哪几个字是名称。

price 对应数字 59,in_stock 对应 true,在本例中表示有货。true、false 这类只有两种状态的值叫布尔值,可以用于表达一个条件是否成立;它们不是带引号的文字。

双引号也帮助软件区分值的类型。59 是数字,"59" 是字符串,也就是一段文本。它们看起来相近,程序读出来的类型却不同,后续计算和比较不能随意混用。JSON 也没有替 59 指定货币单位,这仍然要由使用它的双方约定。

discount 的值是 null,这里没有给出具体折扣。是不适用还是暂时未知,要看接口或业务规则;不能把它直接当成零。JSON 规定数据怎样写,字段的业务含义仍由使用它的双方约定。[1]

大括号和方括号各管什么

最外层的 { } 把这些有名字的值放在一起,这样的一组数据叫对象。对象适合描述“一件东西有哪些信息”,比如这款包的名称、价格和尺寸。不同字段之间用逗号分开。

colors 后面用的是 [ ],里面按顺序放着“米色”和“蓝色”。这种按顺序排列的一组值叫数组,适合表示颜色选项、商品清单或一组消息。程序读取对象时,要按字段名找到值,不应依赖它恰好排在第几行;数组里的先后顺序则是数据的一部分。

size 的值又是一个对象,里面有 width_cm 和 height_cm。把尺寸的两项信息放到一起,就是嵌套。对象和数组还可以互相包含:例如,一份商品清单可以是一个数组,其中每件商品再用一个对象描述。

字符串、数字、布尔值、null、对象和数组,是 JSON 的基本值类型。它们可以组合、嵌套,表达有层次的资料。JSON 的全称是 JavaScript Object Notation,虽源于 JavaScript 的写法,本身却是独立的数据格式,并不限于这门语言[2]。

帆布包商品对象包含名称、价格、颜色数组和尺寸对象的手绘结构示意
示意资料:颜色数组保留先后顺序,尺寸对象把相关字段放在一起。

一份数据怎样交到另一个程序手里

发送方把程序中的商品数据转换为 JSON 文本,这个过程叫序列化;接收方再把文本解析成自己能处理的数据。JavaScript 有 JSON.stringify() 和 JSON.parse()[3],Python 标准库也提供相应能力[4]。两端遵守相同的格式和字段约定,就不必使用同一种语言。

比如,服务器把上面的资料发给网页。网页解析后读到 name 是“帆布包”、price 是 59,再根据页面设计把它们显示成商品名和“¥59”。货币符号、字号、按钮和图片布局由网页决定,并没有自动装在这份 JSON 里。

API 约定怎样调用能力,JSON 约定怎样写数据,界面决定怎样呈现结果。网络 API 可以用 JSON 返回资料,也可以采用别的格式;价格计算、库存判断和数据库查询仍由程序完成。调用这一环节的具体含义,可以接着看 API 是什么?软件之间是怎么“互相办事”的?

发送方生成JSON文本,经网络传输到接收方解析,再由页面显示商品名称和价格的手绘流程
交换过程示意:JSON提供数据写法,传输由通信机制完成,页面样式由接收方决定。

JSON 自己也不会发送数据。传输要由网络通信等机制完成;它同样可以保存在 .json 文件里,供另一个程序读取。即使一份文件符合 JSON 语法,也不意味着价格就一定正确、字段就一定齐全。接收方还要检查内容是否满足自己的要求。

为什么常用,又为什么不是唯一选择

缩进让人容易看清哪些信息属于同一组,固定语法则让程序能读取数据,无需理解自然语言。去掉字符串之外用于排版的空格和换行,前面的资料仍保持同样含义[5];字符串值中的空格属于数据,不能随手删掉。

跨语言支持也是它常用的原因。发送方和接收方可以有不同的内部数据结构,双方只要遵守同一份格式及字段约定,就有办法交换这份资料。JSON 负责这层共同写法,具体的存储、计算和显示仍由各自的软件完成。

标准 JSON 的字段名和字符串要用双引号,最后一个字段后不能多留逗号,也不支持直接写注释[6]。配置文件中的宽松写法,可能来自 JSON5 等扩展格式或软件自己的扩展;换一个 JSON 解析器,未必还读得进去。

数据交换还有其他选择:规整的行列表格,用 CSV 可能更直接[7];一些系统会用 Protocol Buffers,按预先定义的结构编码数据[8]。选哪种格式,要看数据形状、两端支持什么,以及传输和维护要求。

读一份 JSON,字段名和值告诉你写了什么,对象和数组告诉你怎样分组。要把数据用对,还得查清字段的含义、单位,以及缺少或为空时怎样处理。格式让资料可交换,这些约定让资料可使用。

参考资料

  • [1] ECMA-404:https://ecma-international.org/publications-and-standards/standards/ecma-404/
  • [2] JSON 官方介绍:https://www.json.org/json-en.html
  • [3] MDN 的 JSON 说明:https://developer.mozilla.org/en-US/docs/Learn_web_development/Core/Scripting/JSON
  • [4] Python JSON 文档:https://docs.python.org/3/library/json.html
  • [5] RFC 8259:https://www.rfc-editor.org/rfc/rfc8259.html
  • [6] MDN 的 JSON 与 JavaScript 差异说明:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON
  • [7] W3C 表格数据模型:https://www.w3.org/TR/tabular-data-model/
  • [8] Protocol Buffers 概览:https://protobuf.dev/overview/
© 版权声明

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
none
暂无评论...