JSON:不止于数据交换,它能表示这些类型的值
JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,早已成为Web开发、API通信、配置文件等领域的“通用语言”,它的设计初衷是“简单、易读、易解析”,但很多人对它的数据类型认知还停留在“对象”和“数组”上,JSON能表示的值类型远比想象中丰富,且每种类型都有其独特的应用场景,本文将详细解析JSON支持的所有值类型,帮助你更全面地理解这一强大工具。
JSON的“原子类型”:基础数据单元
JSON中最基础、不可再分的值类型被称为“原子类型”,它们是构建复杂数据的基石。
字符串(String):文本数据的载体
字符串是JSON中最常用的类型之一,用于表示文本信息,它必须用双引号()包围(单引号非法),可以包含任意字符(包括Unicode字符、转义字符等)。
示例:
{
"name": "张三",
"message": "Hello, JSON!",
"emoji": "😊",
"path": "C:\\Users\\Admin\\Documents" // 转义双反斜杠
}
应用场景:人名、地址、描述文本、文件路径、API请求参数等所有需要表示文本的场景。
数字(Number):精确与近似的权衡
JSON中的数字不区分整数和浮点数,统一用Number类型表示,支持正负数、小数、科学计数法(如23e-4),但不支持八进制、十六进制(除非通过字符串转义)。
示例:
{
"age": 25,
"price": 99.99,
"scientific": 6.022e23,
"negative": -10
}
注意:JSON数字没有精度区分,但在实际解析时(如JavaScript中),整数会被解析为Number类型(64位浮点数),可能存在大数精度丢失问题(如9007199254740993会被解析为9007199254740992)。
布尔值(Boolean):真假的二选一
布尔值只有两个取值:true(真)和false(假),用于表示逻辑状态,它们是JSON中的“开关”,常用于条件判断、开关配置等场景。
示例:
{
"isStudent": true,
"isActive": false,
"hasPermission": true
}
null:空值的“占位符”
null表示“空值”或“无值”,不同于空字符串或数字0,它是一个独立的类型,用于表示“不存在”或“未知”的状态。
示例:
{
"middleName": null, // 表示中间名不存在
"lastLoginTime": null // 表示用户从未登录过
}
JSON的“结构化类型”:复杂数据的容器
除了原子类型,JSON还支持两种结构化类型,用于组织和管理多个原子值或嵌套结构。
对象(Object):键值对的集合
对象是JSON的核心结构之一,由“键值对”(key-value pairs)组成,键(key)必须是字符串(且唯一),值(value)可以是任意JSON支持的类型(包括对象、数组等),对象用花括号()包围,键值对之间用逗号分隔。
示例:
{
"id": 1001,
"name": "李四",
"contact": {
"email": "lisi@example.com",
"phone": "13800138000"
},
"courses": ["数学", "物理", "化学"],
"isGraduated": false
}
特点:
- 键必须是字符串,且不能重复(重复时后一个值会覆盖前一个);
- 值可以是任意类型,支持嵌套(如对象中的
contact本身也是一个对象); - 无序性(JSON标准不保证键值对的顺序,但多数现代解析器会保留插入顺序)。
数组(Array):有序值的列表
数组是由多个值组成的有序集合,值可以是任意JSON支持的类型(包括对象、数组等),数组用方括号([])包围,元素之间用逗号分隔。
示例:
[
{"name": "商品A", "price": 50},
{"name": "商品B", "price": 80},
null,
true,
[1, 2, 3]
]
特点:
- 有序性:元素按索引排列(从0开始),可通过索引访问;
- 元素类型可不同:一个数组中可以同时包含字符串、数字、对象、数组等;
- 长度可动态变化(JSON本身不限制数组长度,具体受解析器或存储限制)。
JSON“不支持”的类型?—— 如何用现有类型表示
JSON只支持上述6种类型(字符串、数字、布尔值、null、对象、数组),但实际开发中我们常遇到其他类型(如日期、函数、自定义类等),我们可以通过“编码”方式,用JSON支持的类型来间接表示它们。
日期时间(Date/DateTime)
JSON没有原生日期类型,通常用字符串表示(遵循ISO 8601格式)。
示例:
{
"birthday": "1990-01-01",
"loginTime": "2023-10-01T12:34:56Z" // ISO 8601格式,Z表示UTC时间
}
解析时:需在目标语言(如JavaScript、Python)中将字符串转换为日期对象。
函数/方法(Function)
JSON无法直接表示函数(因为它是数据格式,而非代码),但可以通过字符串存储函数代码,或用“配置对象”描述函数行为。
示例(存储函数代码字符串):
{
"callback": "function() { alert('Hello'); }"
}
注意:直接解析并执行此类字符串存在安全风险(如XSS攻击),需谨慎处理。
自定义类/对象(Class Instance)
JSON无法表示类的原型或方法,但可以序列化类的“数据属性”,解析时再根据数据重建对象。
示例(用对象表示用户实例):
{
"userId": 1002,
"userName": "王五",
"roles": ["admin", "editor"]
}
解析时:在JavaScript中可通过Object.create()或类构造函数重建实例,Python中可通过dataclasses或__init__方法还原。
大整数(BigInt)
JavaScript中的BigInt类型(用于表示超过Number精度的整数)无法直接JSON序列化(JSON.stringify()会忽略BigInt属性),通常用字符串表示BigInt。
示例:
{
"bigNumber": "9007199254740993" // 用字符串存储大整数
}
JSON类型全景图
| 类型 | 标记 | 示例 | 特点与应用场景 |
|---|---|---|---|
| 字符串 | 双引号 | "Hello" |
文本数据,如姓名、地址、描述 |
| 数字 | 无特殊标记 | 123、-3.14、1e5 |
数值数据,如年龄、价格、计数 |
| 布尔值 | true/false |
true |
逻辑状态,如开关、权限判断 |
| null | null |
null |
空值或未知状态,如可选字段缺失 |
| 对象 | 花括号 | {"key": "value"} |
键值对集合,表示结构化数据(如用户信息) |
| 数组 | 方括号[] |
["a", 1, true] |
有序列表,表示多个同类数据(如商品列表) |
JSON的简洁性源于其对类型的“克制”,但这种克制也使其成为跨语言、跨平台数据交换的理想选择,理解JSON能表示的值类型,不仅能帮助我们正确设计数据结构,还能在遇到“不支持”的类型时,找到合理的编码方式,无论是构建API、编写配置文件,还是存储数据,JSON的类型体系都为我们提供了灵活而强大的支持。



还没有评论,来说两句吧...