标准的JSON数据格式是什么样的
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,以易于人类阅读和编写、易于机器解析和生成为特点,已成为Web开发中数据传输的主流格式,要理解“标准的JSON数据格式”,需从其基本结构、语法规则、核心特点及常见规范入手,以下从多个维度详细解析。
JSON的基本结构:两种核心数据类型
标准JSON数据仅支持两种核心结构:对象(Object)和数组(Array),所有数据均通过这两种结构嵌套组合而成。
对象(Object):键值对的集合
对象用花括号 包裹,内部由键(Key)和值(Value)成对组成,键值对之间用逗号 分隔,键和值用冒号 连接。
- 键(Key):必须是字符串,必须用双引号 包围(不能用单引号),不能重复。
- 值(Value):可以是多种数据类型(见下文“数据类型”部分)。
示例:
{
"name": "张三",
"age": 25,
"isStudent": false,
"address": {
"city": "北京",
"district": "海淀区"
}
}
上述对象中,"name"、"age" 等是键,对应的值分别是字符串、数字、布尔值,以及另一个嵌套的对象。
数组(Array):有序值的集合
数组用方括号 [] 包裹,内部元素可以是任意JSON数据类型(包括对象、数组等),元素之间用逗号 分隔,元素按顺序排列(可通过索引访问)。
示例:
[
"苹果",
"香蕉",
{
"fruitName": "橙子",
"price": 5.8
},
[1, 2, 3]
]
数组中包含字符串、对象、嵌套数组,体现了JSON的嵌套灵活性。
JSON支持的数据类型:6种基本类型 + 两种结构
JSON的值(Value)可以是以下6种基本类型,或由对象/数组组成的复合类型:
字符串(String)
- 用双引号 包围,不能使用单引号 或反引号
`。 - 支持转义字符,如
\n(换行)、\t(制表符)、\"(双引号)、\\(反斜杠)等。
示例:
"Hello, World!", "JSON \"supports\" escape characters", "多语言文本:你好,世界"
数字(Number)
- 不区分整数和浮点数,统一用数字表示,无需额外类型标记(如
int、float)。 - 支持科学计数法(如
23e4表示 12300),不支持八进制(如012)或十六进制(如0x1F)字面量(除非通过字符串表示)。 - 不能出现前导零(除
0本身),如01是非法的,必须写为1。
示例:
42, -3.14, 1.5e-2, // 表示 0.015 0
布尔值(Boolean)
- 仅两个值:
true(真)和false(假),均为小写,不能写成True、FALSE等形式。
示例:
"isAvailable": true, "hasDiscount": false
null(空值)
- 表示“无值”或“空”,仅有一个关键字
null(小写),不能写成NULL、Null或 (空字符串)。
示例:
"middleName": null
对象(Object)和数组(Array)
如前所述,对象和数组可作为值嵌套在对象或数组中,实现复杂数据结构的表示。
JSON的语法规则:必须遵守的“硬性规范”
JSON的格式严格,任何语法错误都可能导致解析失败,以下是核心语法规则:
引号规范:键必须用双引号
对象的键(Key)必须用双引号 包围,值如果是字符串也必须用双引号,单引号 在JSON中是非法的。
错误示例:
{ 'name': "张三" } // 键使用单引号,非法
{ name: '张三' } // 键无引号,值用单引号,均非法
正确示例:
{ "name": "张三" }
逗号规范:最后一个元素后不能有逗号
对象或数组中的最后一个元素后不能加逗号,否则会导致解析错误(部分宽松的解析器可能容错,但标准JSON不允许)。
错误示例:
{
"name": "张三",
"age": 25, // 最后一个元素后有多余逗号
}
[
"苹果",
"香蕉", // 最后一个元素后有多余逗号
]
正确示例:
{
"name": "张三",
"age": 25
}
[
"苹果",
"香蕉"
]
注释规范:原生不支持注释
JSON标准不支持注释(如 单行注释或 多行注释),因为注释会被解析为数据的一部分,导致格式错误,若需添加注释,可通过以下方式“曲线救国”:
- 将注释作为键的值(如
"comment": "这是用户信息"); - 在JSON外部通过字段名或文档说明(如API文档中单独标注字段含义)。
错误示例:
{
// 这是用户名 // 原生注释,非法
"name": "张三"
}
正确替代方案:
{
"name": "张三",
"comment": "这是用户名"
}
数据类型严格:不支持函数、日期等特殊类型
JSON仅支持前述6种基本类型,不支持函数、日期、正则表达式、undefined等特殊类型,若需表示这些类型,需转换为字符串:
- 函数:转为字符串(如
"function() { return 1; }"); - 日期:转为ISO 8601格式字符串(如
"2023-10-01T12:00:00Z"); - undefined:转为
null或字符串"undefined"。
错误示例:
{
"callback": function() { console.log("Hello"); }, // 函数类型,非法
"birthday": new Date("1998-05-20") // 日期对象,非法
}
正确示例:
{
"callback": "function() { console.log(\"Hello\"); }",
"birthday": "1998-05-20T00:00:00Z"
}
编码规范:仅支持UTF-8字符
JSON必须使用UTF-8编码,支持多语言文本(如中文、emoji),其他编码(如GBK、ISO-8859-1)需在传输或存储前转换为UTF-8。
JSON的标准示例:从简单到复杂
通过示例可更直观理解标准JSON的格式:
简单对象(单个用户信息)
{
"userId": 1001,
"username": "json_demo",
"isActive": true,
"balance": null
}
嵌套对象(用户地址信息)
{
"userId": 1001,
"username": "json_demo",
"address": {
"street": "科技园路1号",
"city": "深圳",
"coordinates": {
"latitude": 22.5455,
"longitude": 113.9308
}
}
}
数组嵌套对象(用户列表)
[
{
"userId": 1001,
"username": "user_a",
"hobbies": ["阅读", "游泳"]
},
{
"userId": 1002,
"username": "user_b",
"hobbies": ["编程", "篮球"]
}
]
复杂嵌套(订单信息)
{
"orderId": "ORD-20231001001",


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