JSON报文格式是什么样的?一篇文章带你全面了解
JSON(JavaScript Object Notation,JavaScript对象表示法)是一种轻量级的数据交换格式,因其简洁、易读、易解析的特性,成为Web开发中前后端数据交互的主流格式,无论是API接口返回数据、配置文件存储,还是跨系统数据传输,JSON都扮演着重要角色,JSON报文究竟长什么样?它的结构有哪些规则?本文将从基础到实例,全面解析JSON报文的格式。
JSON报文的本质:键值对的集合
从核心结构看,JSON报文本质上是“键值对的集合”,通过特定的语法规则组织数据,它支持两种核心结构:对象(Object)和数组(Array),所有数据都围绕这两种结构展开。
对象(Object):无序的键值对集合
对象是JSON中最常用的结构,用花括号 包裹,内部由多个“键:值”对组成,键值对之间用逗号 分隔。
关键规则:
- 键(Key):必须是字符串,必须用双引号 包围(不能用单引号)。
- 值(Value):可以是多种数据类型(见下文“数据类型”部分)。
- 无序性:对象中的键值对没有顺序,不依赖排列顺序定义数据。
示例:
{
"name": "张三",
"age": 25,
"isStudent": false,
"address": {
"city": "北京",
"district": "海淀区"
}
}
解释:这是一个用户对象,包含name(字符串)、age(数字)、isStudent(布尔值)、address(嵌套对象)四个键值对。
数组(Array):有序的值集合
数组用方括号 [] 包裹,内部由多个值组成,值之间用逗号 分隔,数组中的值可以是任意JSON支持的数据类型(包括对象和数组),且有序(通过索引访问)。
示例:
[ "苹果", "香蕉", "橙子" ]
或包含对象的数组:
[
{
"id": 1,
"name": "商品A",
"price": 99.9
},
{
"id": 2,
"name": "商品B",
"price": 149.9
}
]
JSON支持的数据类型
JSON的值(Value)可以是以下6种类型,其中前4种是“基本类型”,后2种是“结构类型”:
字符串(String)
- 用双引号 包围的字符序列(不能使用单引号)。
- 支持转义字符,如
\n(换行)、\t(制表符)、\"(双引号)、\\(反斜杠)等。 - 示例:
"Hello, JSON!"、"这是一个\"测试\"字符串"。
数字(Number)
- 不区分整数和浮点数,统一用数字表示。
- 支持正负号、小数点、科学计数法(如
23e-5)。 - 不能使用八进制、十六进制(如
012、0xFF无效),也不能使用NaN或Infinity。 - 示例:
100、-3.14、022e23。
布尔值(Boolean)
- 只有两个值:
true(真)和false(假),全小写,不能大小写混用(如True或FALSE无效)。 - 示例:
"isActive": true。
空值(Null)
- 表示“空”或“无值”,只有一个值:
null(全小写)。 - 示例:
"middleName": null(表示中间名为空)。
对象(Object)
- 如前所述,无序的键值对集合,用 包裹。
- 示例:嵌套对象(见第一个对象示例中的
address字段)。
数组(Array)
- 如前所述,有序的值集合,用
[]包裹。 - 示例:嵌套数组(如下方示例中的
hobbies字段):{ "name": "李四", "hobbies": ["阅读", "游泳", "编程"] }
JSON报文的语法规则(必须遵守)
JSON的语法非常严格,任何格式错误都可能导致解析失败,以下是核心规则:
键必须用双引号包围
对象的键必须是字符串,且必须用双引号 ,不能用单引号 或无引号。
❌ 错误示例:{name: "张三"}(键无引号)、{'age': 25}(键用单引号)
✅ 正确示例:{"name": "张三", "age": 25}
值的数据类型必须匹配
- 字符串值必须用双引号,数字不能加引号(
"25"是字符串,25是数字)。 - 布尔值必须是
true/false,不能是TRUE/False等。 - 空值必须是
null,不能是NULL或Null。
❌ 错误示例:{"age": "25"}(数字被写成字符串,可能导致类型解析问题)
✅ 正确示例:{"age": 25}(数字类型)
逗号分隔,但末尾不能有逗号
- 键值对之间、数组元素之间用逗号 分隔,但最后一个键值对或数组元素不能有逗号(即“ trailing comma ”)。
❌ 错误示例:
{
"name": "张三",
"age": 25, // 末尾逗号
}
或数组:["苹果", "香蕉", "橙子", ]
✅ 正确示例:
{
"name": "张三",
"age": 25
}
数组:["苹果", "香蕉", "橙子"]
支持嵌套结构,但需层次清晰
对象和数组可以无限嵌套(如对象中嵌套数组,数组中嵌套对象),但必须通过 和 [] 明确区分层次。
示例(多层嵌套):
{
"school": "清华大学",
"students": [
{
"id": 101,
"name": "王五",
"courses": ["数学", "物理", "英语"],
"score": {
"math": 95,
"physics": 88
}
},
{
"id": 102,
"name": "赵六",
"courses": ["化学", "生物"],
"score": null
}
]
}
注释?不支持的!
JSON标准不支持注释(如 // 单行注释 或 /* 多行注释 */)。
这是因为JSON的核心定位是“数据交换格式”,而非配置文件(如YAML支持注释),如果需要在JSON中添加说明,通常通过键值对实现(如 {"note": "这是用户数据"})。
JSON报文的实际示例(常见场景)
通过几个典型场景,进一步理解JSON报文的样子:
用户登录接口返回数据
{
"code": 200,
"message": "登录成功",
"data": {
"userId": "10086",
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"userInfo": {
"nickname": "旅行者",
"avatar": "https://example.com/avatar.jpg"
}
}
}
商品列表API返回数据
{
"total": 2,
"items": [
{
"id": "A001",
"name": "无线蓝牙耳机",
"price": 299.00,
"stock": 100
},
{
"id": "A002",
"name": "智能手表",
"price": 1299.00,
"stock": 50
}
]
}
简单配置文件
{
"database": {
"host": "localhost",
"port": 3306,
"username": "root",
"password": "123456


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