标准的JSON字符串怎么写
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,因其易读易写、结构清晰,成为前后端数据交互、配置文件存储等场景的常用选择,要编写“标准”的JSON字符串,需严格遵循其语法规范,同时兼顾可读性和兼容性,本文将从核心语法、常见错误、实用技巧三个方面,详细拆解标准JSON字符串的编写方法。
JSON的核心语法规范:构建标准字符串的“基石”
JSON字符串的本质是用特定格式表示数据结构的文本,其语法基于JavaScript对象字面量,但有严格的限制,以下是核心规则,缺一不可:
数据类型:JSON支持的“基本元素”
JSON仅支持以下6种数据类型,其他类型(如Date、Function、undefined)需通过转换后才能表示:
- 字符串(String):必须用双引号()包裹,不能用单引号()或反引号(
`)。"name"、"Hello, JSON"。 - 数字(Number):整数或浮点数,无需引号。
25、14、-10,注意:不支持八进制(如012)或十六进制(如0x1A)字面量,科学计数法可用(如5e3)。 - 布尔值(Boolean):只能是小写的
true或false,不能是True、FALSE或其他形式。 - 空值(Null):只能是小写的
null,不能是NULL、None或nil。 - 数组(Array):值(value)的有序集合,用方括号(
[])包裹,元素间用逗号()分隔,元素可以是上述任意类型,包括嵌套的数组或对象。[1, "two", true, [3, 4]]。 - 对象(Object):键值对的无序集合,用花括号()包裹,键值对间用逗号分隔,格式为:
{"key1": value1, "key2": value2}。键(key)必须是字符串(且必须用双引号),值(value)可以是任意JSON数据类型。
结构规则:让字符串“有章可循”
- 引号强制:所有字符串类型的键和值,必须用双引号包裹,这是JSON与JavaScript对象字面量最显著的区别(后者允许键不用引号,值可用单引号)。
- 逗号规范:数组或对象中,最后一个元素后不能有逗号。
[1, 2,]或{"a": 1,}是非法的,会解析失败。 - 嵌套自由:数组和对象可以无限嵌套,
{"user": {"name": "Alice", "hobbies": ["reading", "coding"]}, "age": 30}。 - 编码要求:字符串只能包含Unicode字符,且需转义特殊字符(见下文“转义规则”)。
转义规则:避免字符串“失效”的特殊字符
JSON字符串中的某些字符需用反斜杠(\)转义,否则会导致解析错误,必须转义的特殊字符包括:
\"(双引号):字符串本身包含双引号时,需转义,"He said: \"Hello!\""。\\(反斜杠):字符串本身包含反斜杠时,需转义,"C:\\Users\\Admin"。\/(斜杠):虽然不强制转义,但建议转义以避免与HTML等场景冲突,"<\/p>"。\b(退格符)、\f(换页符)、\n(换行符)、\r(回车符)、\t(制表符):这些控制字符需转义,"Line1\nLine2"。\uXXXX(Unicode字符):对于非ASCII字符(如中文),可以用Unicode转义表示,\u4e2d\u56fd(等同于"中国"),实际编写时,直接写中文字符("中国")更直观,JSON解析器会自动处理。
编写JSON字符串的常见错误:避坑指南
即使了解了语法规范,实际编写时也容易因细节疏忽导致“非标准”,以下是高频错误及示例:
错误1:使用单引号或无引号的键
// 错误示例1:键用单引号
{'name': 'Alice', 'age': 25}
// 错误示例2:键无引号
{name: 'Alice', age: 25}
修正:键必须用双引号包裹:
{"name": "Alice", "age": 25}
错误2:字符串值用单引号
// 错误示例
{'message': 'Hello, JSON!'}
修正:字符串值必须用双引号:
{"message": "Hello, JSON!"}
错误3:数组或对象末尾有多余逗号
// 错误示例1:数组末尾有逗号
[1, 2, 3, ]
// 错误示例2:对象末尾有逗号
{"a": 1, "b": 2, }
修正:移除末尾逗号:
[1, 2, 3]
{"a": 1, "b": 2}
错误4:使用JavaScript特有的字面量
// 错误示例1:undefined
{"data": undefined}
// 错误示例2:函数
{"callback": function() {return true}}
// 错误示例3:Date对象(直接输出)
{"time": new Date()}
修正:JSON不支持这些类型,需转换为字符串:
{"data": null} // undefined转为null
{"callback": null} // 函数转为null
{"time": "2023-10-01T12:00:00Z"} // Date转为ISO字符串
错误5:未转义字符串中的特殊字符
// 错误示例:字符串包含双引号且未转义
{"quote": "He said: "This is JSON""}
修正:用反斜杠转义双引号:
{"quote": "He said: \"This is JSON\""}
实用技巧:让JSON字符串更“标准”且“好用”
编写JSON字符串时,除了遵循语法规范,以下技巧能提升代码质量:
格式化:用缩进和换行提升可读性
JSON是“自描述”的,合理的格式化能让人快速理解数据结构,推荐使用2或4个空格缩进,每行一个元素(数组或对象):
{
"user": {
"id": 1001,
"name": "Bob",
"hobbies": [
"swimming",
"traveling",
"photography"
]
},
"settings": {
"theme": "dark",
"notifications": true
}
}
避免注释:原生JSON不支持,需用“变通方案”
JSON标准中不允许直接写注释(如或),因为解析器会将其视为非法字符,若需注释,可通过以下方式实现:
- 方案1:用“键”注释:添加一个以
_comment开头的键,{"_comment": "用户信息", "name": "Alice"}。 - 方案2:用工具预处理:在构建JSON字符串时,先用注释标记,再通过工具(如
strip-json-comments)移除注释。
数值精度:避免浮点数精度问题
JSON中的数字会遵循JavaScript的数值精度(IEEE 754双精度浮点数),大整数或高精度小数可能丢失精度。{"bigNum": 12345678901234567890}会被解析为2345678901234567e+19,若需精确表示大整数,可:
- 用字符串包裹:
{"bigNum": "12345678901234567890"}(需在接收方手动转回整数)。 - 使用
BigInt(但JSON本身不支持,需通过自定义序列化/反序列化处理)。



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