☰
JSON入门指南:从语法、解析到避坑,一篇搞懂
2026/10/10 10:31:27 网站建设 项目流程

1. 为什么现在还要专门整理一份JSON入门

先交代一下背景。这些年我接触过不少刚入门的新人,也带过几个转行的朋友,发现一个挺有意思的现象:很多人看一眼JSON的示例就觉得自己会了,真到了联调接口、改配置文件的时候,却经常被一个逗号、一个引号折磨到深夜。

JSON全称是JavaScript Object Notation,中文一般叫JavaScript对象表示法。它最初是从JavaScript里长出来的数据格式,但因为结构简单、可读性强、跨语言支持好,后来几乎成了互联网数据传输的事实标准。你在前端调后端接口、写Node脚本、配代码检查规则、声明容器编排服务,甚至跟AI工具对话,底层都在跟JSON打交道。

这篇内容是我基于平时踩坑、带新人的经验整理的一份入门指南,不堆术语、不绕弯子。我会从JSON最底层的语法规则讲起,带着你手写一份真正的配置文件,再用实际代码演示解析和序列化这两个日常使用频率最高的动作,最后把新手最容易踩的坑集中过一遍。适合完全没接触过JSON的小白,也适合那些"会用但说不清楚"的开发者拿来查漏补缺。

有人可能会问:JSON这么基础,还需要专门讲吗?我的回答是:正因为基础,才值得搞清楚。数据结构没玩明白,后面学什么框架、工具链都会觉得拧巴。你写的每一行配置、每一次接口返回的格式化输出,本质上都在跟JSON打交道,与其靠碎片化搜索拼凑知识,不如花二十分钟把骨架搭起来。

2. JSON的语法骨架:对象、数组和六种数据类型

2.1 对象:JSON里最核心的结构

JSON的基本单位是"键值对"。一组键值对用花括号包起来,就构成了一个对象。键必须是双引号包裹的字符串,值可以是任意合法的JSON数据类型,键和值之间用冒号分隔,多个键值对之间用逗号分隔。

{ "name": "张三", "age": 28, "isStudent": false }

这里有几个细节值得新手特别留意。第一个是键必须用双引号,单引号在JSON里是非法字符,这一点和JavaScript的对象字面量不一样——后者单双引号都能用,很多初学者就是在这里栽了跟头。第二个是最后一个键值对后面不能跟逗号,也就是所谓的"尾逗号",后面我会专门讲这个问题。第三个是键名不能重复,虽然有的解析器会静默接受重复键并取最后一个值,但标准规范对此是禁止的,实际项目中应当避免。

2.2 数组:有顺序的值的集合

数组用方括号表示,里面存放一组值,值之间用逗号分隔。数组里的元素可以是任意数据类型,也可以是嵌套的数组或对象。

[ "苹果", "香蕉", 42, true, null ]

数组在实际场景里的典型用途是存放同类的数据集合。比如一个用户的手机号列表,或者一个班级的所有学生对象。JSON没有注释、没有日期类型、没有二进制类型,它是一个非常克制的格式,但这种克制恰好是它能够跨语言通用、跨版本稳定的关键。很多人刚接触时会觉得JSON"功能不够",其实这正是它最大的优点——约束越少,兼容性越强。

2.3 六种数据类型逐个拆解

JSON规范中合法值只有六种,这一点是整个格式的灵魂。我把它列成一张表,方便对照记忆:

类型写法示例说明
字符串"hello"必须双引号,支持部分转义字符
数字42 或 3.14整数和小数,不支持NaN和Infinity
布尔值true / false只有这两个,没有True/TRUE
空值null表示空,不与0、空字符串等价
数组[1, 2, 3]有序集合
对象{"key": "value"}无序键值对集合

数字这一栏值得展开说说。JSON里的数字可以是整数,也可以是小数,还可以用科学计数法表示,比如1.5e3。但它不支持NaN、Infinity这类特殊值,也不允许前导零,比如012就是非法的。这些限制在大多数日常场景中用不上,但当你跟某些严格模式的解析器打交道时,就会明白这些边界条款有多重要。

字符串支持转义字符,常用的有\"(双引号)、\\(反斜线)、\n(换行)、\t(制表符)等。在格式化JSON时,中文通常不需要转义,JSON规范允许直接使用Unicode字符。文件编码建议统一用UTF-8,否则跨平台传输时很容易出现乱码,尤其是Windows记事本编辑过的文件,这是老生常谈却依然高频发生的坑。

3. 从零手写一份真实可用的JSON配置文件

理论讲完了,现在进入实战。比起抽象地背语法,我更推荐直接拿一个真实场景练手。下面我们要为一个小型的博客系统写一份配置文件,覆盖常见的配置需求。

3.1 从最简单的对象开始

假设我们需要声明站点的基本信息:站点名称、建立年份、是否对外可见。

{ "siteName": "我的博客", "establishedYear": 2024, "publicAccess": true }

这一步非常简单,但请务必注意,字符串值里的中文不需要加引号以外的任何处理,直接写就行。嵌套对象、数组组合起来的时候,缩进和换行会影响可读性,但本身不影响合法性。真正决定合法性的只有括号、引号、冒号、逗号这四样东西,记住这一点,排错的时候思路会清晰很多。

3.2 叠加数组和嵌套对象

真实配置不可能只有三个字段。博客需要导航菜单、作者信息、以及文章分类。这时候就要用到数组和嵌套对象了:

{ "siteName": "我的博客", "establishedYear": 2024, "publicAccess": true, "navItems": [ { "label": "首页", "url": "/" }, { "label": "关于", "url": "/about" } ], "author": { "name": "张三", "email": "zhangsan@example.com", "social": ["github", "twitter"] }, "categories": ["技术", "生活", "随笔"] }

这段配置里出现了三层嵌套:最外层是包含所有字段的对象,navItems是对象数组,而author本身是一个对象,它内部又有一个字符串数组social。写到这里你应该能感觉到,JSON的组合能力非常强,用基础数据结构就能表达大多数业务数据。

写嵌套结构时有个习惯值得养成:每层缩进保持一致,推荐两个空格。常见工具链默认就是两个空格,也有人用四个空格或Tab,这些本身不影响JSON的合法性,但保持统一能显著降低阅读成本。我在带新人时反复强调,JSON的可读性是你写的配置能否被别人快速维护的关键,别为了少敲几个字符牺牲清晰度。

3.3 校验:写完配置后的第一个动作

手写JSON最大的问题不是不会写,而是写错了自己看不到。我强烈建议每个新手养成写完就校验的习惯。有几个方式:

  • 在线校验工具,粘贴进去立刻能看到语法错误位置。
  • 编辑器插件,比如主流代码编辑器自带的JSON语言服务,会在你编辑的同时标红错误行。
  • 命令行工具,比如jq,不仅能校验语法,还能格式化输出。

我之前带过一个A同学,他在配置代码检查规则的时候花了整整一个下午,最后发现只是少了一个右括号。这种错误肉眼找很难受,但用校验工具十秒钟就能定位。别把所有时间花在肉眼里,工具是帮助你提升效率的,不是偷懒的借口。

还有一个实用场景:接口联调时,后端返回的JSON经常是一整行压缩格式,肉眼根本看不了。这时用jq处理一下特别舒服:

echo '{"siteName":"我的博客","author":{"name":"张三"}}' | jq .

输出会自动缩进、给键名配色,结构一目了然。类似的工具还有一些,但jq在命令行环境里普及率最高,跨平台都能用,值得常备。

4. 解析与序列化:日常开发中最高频的两个动作

写配置只是JSON入门的第一站,真正的高频场景是程序读取JSON和生成JSON。这两个动作的术语叫解析(parse)和序列化(stringify)。

4.1 把JSON文本变成对象:解析

几乎所有现代开发语言都内置了JSON解析能力。用JavaScript举例:

const rawJson = '{"name": "张三", "age": 28}'; const user = JSON.parse(rawJson); console.log(user.name); // 输出:张三

JSON.parse接收一个JSON格式的字符串,把它转换成JavaScript对象。这个过程会做语法校验,如果字符串不是合法的JSON,会直接抛出异常。所以在解析不可信的接口返回时,最好用try/catch包一下,避免程序直接崩溃。

错误信息常常让人困惑,比如Unexpected token 'a'这种报错,新手看了通常一头雾水。我的排查经验是:先把返回的字符串原样打印出来,看看开头和结尾有没有多余的引号、逗号、或者HTML标签。很多情况下,问题不是JSON本身写错了,而是接口返回的不是纯JSON——可能是被网关包装过、包含了HTML、或者用了单引号。这类问题在联调阶段出现频率极高,筛查思路比背报错含义更管用。

4.2 把对象变成JSON文本:序列化

反方向的操作用JSON.stringify,把JavaScript对象转换为JSON字符串:

const user = { name: "张三", age: 28 }; const jsonText = JSON.stringify(user); console.log(jsonText); // 输出:{"name":"张三","age":28}

序列化在前后端通信中尤其常见。前端要把表单数据提交给后端,通常先把JavaScript对象转成JSON字符串放入请求体;后端返回数据时,框架会自动把对象序列化成JSON文本,前端再解析回来。这一来一回,就是现代Web架构中最常见的数据交换模式。

JSON.stringify还有很多细节:比如第二个参数可以传入函数或数组,用来控制哪些字段被序列化;第三个参数传数字可以缩进空格数,让输出更可读。比如JSON.stringify(user, null, 2)就会输出带两空格的格式化文本。这些参数在日常调试中很实用,特别是打印复杂对象的时候,格式化输出会清晰得多。

4.3 其他语言里的JSON处理

不只JavaScript有JSON处理函数,其他语言也都内置或通过标准库提供了对应能力。Python用json模块,Java生态里常用Jackson或Gson,Go用encoding/json,C#用System.Text.Json。换语言的时候,JSON的知识可以直接迁移,变的只是API的调用方式。

用Python做一个对比:

import json data = json.loads('{"name": "张三", "age": 28}') print(data["name"]) json_text = json.dumps(data, ensure_ascii=False, indent=2) print(json_text)

注意这里的ensure_ascii=False,它在Python里非常常用。默认情况下,json.dumps会把非ASCII字符转成\uXXXX形式,中文在文件里会变成一串转义序列,肉眼不可读。设置成False之后,中文就能正常显示。这个细节在实际开发中经常困扰新人,我碰见过好几个朋友说自己打印的JSON全是\u5f20\u4e09,其实就是这个参数没设置。

5. 新手最容易踩的坑:从报错现场总结出的清单

理论会了,代码也写了,接下来到了最关键的部分——避坑。这部分内容来自我真实的排错经历和带新人时收集到的典型问题,比官方文档里那些"应当注意"要接地气得多。

5.1 尾逗号:看着没错,就是报错

最常见的错误是尾逗号。人脑对"最后一个值后面不该有逗号"这件事感知很弱,因为很多其他语言和格式都允许尾逗号——JavaScript函数参数、Python元组、日常书写习惯都是允许的。但JSON严格禁止。

{ "name": "张三", "age": 28, }

这个28后面的逗号就是非法的,解析器会直接报错。修起来很简单,删掉它。但预防很重要,我建议你在写多行对象的时候,养成"写完最后一个键值对就停手"的肌肉记忆,不要为了以后加字段而提前打上逗号,后期维护时再加就行。

5.2 单引号当双引号用

JSON里所有字符串必须用双引号包裹。很多人受JavaScript和Python的影响,习惯性地写单引号,然后被解析报错。请注意,这不是"风格问题",而是语法错误。规范就是规范,JSON不讨论引号的审美。

这一点在配置文件里尤其容易犯。很多配置文件的体系本身就接受宽松语法,比如JavaScript的配置文件可以用对象字面量、可以写注释,导致大家习惯了自由写法;但一旦换成纯JSON的配置文件,同样的习惯就会立刻踩线。拿到一个文件时,先搞清楚它到底要求纯JSON还是宽容格式,能省掉不少无头绪的排查。

5.3 注释和undefined

JSON不支持注释,也不支持JavaScript里的undefined。如果你在配置文件里写// 这是注释,解析器会直接报错;如果你在JavaScript对象里包含值为undefined的字段,JSON.stringify会静默跳过这个字段,而不是报错,这一点尤其隐蔽——数据明明还在,序列化后却"丢了"。

所以当序列化结果和你预期不符时,先检查对象里有没有undefined、函数、Symbol这类JSON不支持的成员。它们要么被跳过,要么被改成null,具体行为取决于运行环境的实现。

5.4 数字精度问题

JSON的数字基于IEEE 754双精度浮点数标准。这意味着超过一定精度的整数,比如9007199254740993,在解析过程中可能会丢失精度。这个问题在做订单号、ID这类需要高精度数据的场景中很常见,解决办法是把它当作字符串处理,或者在业务层使用支持大整数的类型库。

我见过一个真实案例:某同事在联调时发现用户ID前后不一致,排查了半天,最后定位到ID超过JavaScript安全整数范围,解析时精度被截断了。从那以后,我在团队里定了一条约定:凡是超过16位的数字型ID,一律按字符串传输。这个约定看起来简单,但能避免一大类隐蔽的bug。

5.5 安全:别用eval解析JSON

老代码里偶尔能看到用eval解析JSON的做法,这非常危险。因为eval会把字符串当作代码执行,如果JSON内容来自不可信源,等于把代码执行权限拱手让人。标准做法永远是用语言自带的解析函数,比如JavaScript的JSON.parse。这一点再怎么强调都不过分,安全问题没有后悔药。

另外,一些后端框架默认的JSON解析器在序列化时会把对象内部不可枚举的字段也带出来,可能造成敏感信息泄露。这类问题不在JSON语法范畴内,但属于实际使用中必须警惕的边界。我的建议是:针对输出对象显式声明字段白名单,别依赖默认行为。

6. 什么时候该用JSON,什么时候该换别的格式

JSON不是万能的,但它确实覆盖了绝大多数场景。入门之后,顺便了解一下它的边界,能够帮你在技术选型时少走弯路。我把常见的数据格式对比列在下面:

格式优势劣势典型场景
JSON通用、简单、可读性好无注释、无日期类型接口数据、配置文件
YAML支持注释、可读性好缩进敏感、解析复杂编排配置、持续集成
XML支持属性、文档标准冗长、解析繁琐老系统、某些行业规范
CSV极简、表格数据友好无法表达层级数据导入导出
Protobuf体积小、解析快不可读、需定义结构高性能内部通信

我的个人经验是:默认选择JSON不会有错,但如果你需要写注释、需要人类频繁编辑且关心可维护性,YAML往往更合适;如果数据量和性能是首要指标,且通信双方都是内部服务,二进制方案值得考虑。JSON最大的优势也是它最大的局限——简单,所以它表达复杂结构的能力比较有限。知道边界在哪里,才能真正做出好决策。

回到入门这件事本身,我最后再分享一个小技巧。学任何新概念,都尽量找一个真实场景去套用:给某个工具写一份JSON配置、把接口返回的JSON打印出来仔细读一遍、或者用命令行工具格式化一份JSON文件。数据结构这东西,光看不练永远记不牢。我在实际排查问题的时候,最常用的一招就是先把出问题的JSON复制出来格式化,肉眼过一遍结构,再决定下一步查哪里。这一招看着普通,但效果好得惊人,你可以直接从自己手头最常打交道的那个JSON文件开始试起。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询