不管你用什么语言写后端前端发过来的数据大概率长这样{username: zhangsan, password: 123456}。这就是 JSON。 打开任何一个 Web API 的文档请求和响应的格式几乎都是 JSON。配置文件是 JSON数据库里存的结构化文本是 JSON前后端之间传来传去的还是 JSON。这篇把 JSON 格式本身讲清楚它是什么、有哪些规则、为什么它成了事实标准。一、JSON介绍1.1 JSON是什么 JSONJavaScript Object Notation是一种纯文本格式用来表示结构化数据。长这样{name:zhangsan,age:28,skills:[Python,Flask],active:true} 虽然名字里带 JavaScript它确实是 2001 年从 JS 语法里提炼出来的但今天它早就不是任何语言的专属了。Python 有json模块Java 有 Gson/JacksonGo 有encoding/jsonRust 有 serde_json……几乎所有主流语言都内置或有成熟的 JSON 支持。 JSON 的全部内容就写在一页纸就够的规范里json.org这种极简是它能成为通用格式的根本原因。1.2 语法规则只有六种类型 JSON 的数据类型只有六种记住这张表就掌握了全部语法类型示例说明stringhello必须用双引号不能用单引号number42,3.14,-1整数或浮点数不支持0x、NaN、Infinitybooleantrue,false全小写不是True/Falsenullnull表示没有值不是None、不是nilarray[1, two, true]有序列表元素可以是任意类型object{key: value}键值对集合键必须是双引号字符串 整个 JSON 世界就建立在这六块积木上。没有日期类型、没有二进制类型、没有注释这些缺失是刻意为之的设计选择后面会讲为什么。 一个完整的例子六种类型全覆盖{user_id:1,username:zhangsan,email:null,active:true,scores:[95,87,92],profile:{bio:Backend developer,years:3}} object 和 array 可以任意嵌套所以 JSON 能表达很复杂的数据结构。但每个叶子节点最终都是 string、number、boolean 或 null。二、JSON规则 JSON 语法很宽松但有几条铁律不能违反违反了解析器会直接报错2.1 键必须是双引号字符串错误 ❌ {name: zhangsan} 错误 ❌ {name: zhangsan} 正确 ✅ {name: zhangsan} 这是和 JavaScript 对象字面量的最大区别。JS 里键可以不加引号JSON 里不行。2.2 字符串必须用双引号错误 ❌ {name: zhangsan} 正确 ✅ {name: zhangsan} 单引号在 JSON 里不合法。写 Python 的人特别容易踩这个坑Python 里单双引号等价JSON 里只认双引号。2.3 尾部不能有逗号错误 ❌ {name: zhangsan, age: 28,} 正确 ✅ {name: zhangsan, age: 28} 最后一个元素后面不能有逗号。很多语言JavaScript、Python、Go都允许尾逗号但 JSON 不行。2.4 不能有注释 JSON 不支持任何形式的注释没有//没有/* */没有#。 这是 JSON 发明者 Douglas Crockford 的刻意决定。他认为注释会导致解析复杂化和滥用比如把处理指令藏在注释里。如果你需要带注释的配置文件可以用 JSONCVS Code 在用的格式、YAML 或 TOML。2.5 顶层必须是一个值 一个合法的 JSON 文档顶层必须是上面六种类型之一。最常见的是 object{}或 array[]但一个单独的hello、42、true、null也是合法的 JSON。三、两种风格紧凑 vs 格式化 同一份数据可以有两种写法含义完全相同。3.1 紧凑风格 一行搞定没有多余空白{user_id:123,name:zhangsan,role:user}3.2 格式化风格 有缩进和换行人眼友好{user_id:123,name:zhangsan,role:user} JSON 规范不关心空白解析器看到{user_id:123}和{ user_id : 123 }认为是完全一样的数据。但空白会影响文本内容本身这在某些场景很关键。 比如对 JSON 文本做哈希或 Base64 编码时同一个 object紧凑格式和带空格的格式算出来的结果完全不同。多一个空格编码就对不上。3.3 什么时候用哪种读者是机器就紧凑读者是人就格式化。场景选哪种原因API 请求/响应体紧凑省带宽客户端收到后自己解析不需要好看存进 Redis / 数据库紧凑十万条数据每条多几个空格就是几 MB 内存签名、哈希、Base64 编码紧凑多一个空格结果就变了格式必须固定package.json等配置文件格式化要用编辑器打开手动改不好看就没法维护日志输出格式化线上排查问题时需要快速肉眼定位字段调试时 print 出来看格式化紧凑的一坨字符串根本读不动四、JSON 为什么赢了 在 JSON 之前数据交换的主流格式是 XMLusernamezhangsan/nameage28/ageskillsskillPython/skillskillFlask/skill/skillsactivetrue/active/user 同样的数据用 JSON{name:zhangsan,age:28,skills:[Python,Flask],active:true} 差别一目了然JSONXML可读性接近自然语言标签噪音大体积紧凑开闭标签占大量空间解析速度快结构简单慢需要处理属性、命名空间等数据类型原生区分 string/number/boolean全是字符串类型靠约定学习成本5 分钟需要理解 DTD、Schema、XPath… XML 不是没有优势它支持注释、命名空间、混合内容文本和标签穿插在文档标记领域HTML 就是 XML 的近亲依然无可替代。但对于两个程序之间传结构化数据这个场景JSON 用更少的字符做到了同样的事。 2005 年之后随着 AJAX 和 REST API 的普及JSON 迅速取代 XML 成为 Web API 的事实标准。今天你打开任何一个公开 API 的文档返回格式几乎都是 JSON。五、JSON 在哪里 JSON 不是某一个环节的专属工具它渗透在整个技术栈里。从用户点击按钮到数据落盘中间流转的大概率都是 JSON。 知道了语法再看看你日常开发中哪些地方其实已经在跟 JSON 打交道了可能比你想的多得多。5.1 API前后端之间的普通话 你用浏览器登录一个网站点击登录按钮浏览器发出去的请求体长这样{username:zhangsan,password:123456} 服务器处理完返回的响应体也是 JSON{code:200,message:登录成功,token:eyJhbGciOi...} 这就是 REST API 的日常请求是 JSON响应也是 JSON。打开 GitHub、微信、支付宝的开放平台文档接口格式清一色都是它。5.2 配置文件程序的说明书 用过 VS Code 的都见过settings.json写过前端项目的都改过package.json用 TypeScript 就有tsconfig.json。这些配置文件选 JSON 的原因很简单结构清晰、所有语言都能解析、不需要额外装库。{name:my-project,version:1.0.0,scripts:{dev:vite,build:vite build}} 不过 JSON 不支持注释这一点在配置场景里确实不方便所以 VS Code 实际用的是 JSONCJSON with Commentstsconfig.json也允许注释。严格来说它们不是标准 JSON但解析器做了兼容。5.3 数据库不只是关系型的世界 MongoDB 整个数据模型就建立在类 JSON 的文档结构上存进去的每条数据就是一个 JSON object。PostgreSQL 有专门的jsonb字段类型可以直接在 SQL 里查询 JSON 内部的键值。Redis 的值是字符串实际项目中存的往往就是 JSON 序列化后的结果。-- PostgreSQL直接查 JSON 里的字段SELECTdata-usernameFROMusersWHEREdata-roleadmin;5.4 日志给机器看的也是 JSON 传统日志是一行行自由文本人能读但机器很难解析。现代日志系统ELK、Loki、CloudWatch越来越多地采用结构化日志每条日志就是一个 JSON object{timestamp:2026-03-26T08:30:00Z,level:ERROR,service:auth,message:token expired,user_id:123} 好处是显而易见的可以按level过滤、按service聚合、按user_id追踪不需要写正则去文本里捞信息。六、总结JSON 是纯文本格式只有六种数据类型string、number、boolean、null、array、object键必须用双引号字符串、尾部不能有多余逗号、不能含注释规则少但严格紧凑和格式化两种风格含义相同但文本内容不同影响编码和签名它赢了 XML因为更简单、更轻量、解析更快在 Web 开发中JSON 不是某个具体技术的附属而是数据交换的通用语言 知道了 JSON 是什么下一步就是用代码操作它怎么把程序里的数据结构转成 JSON 字符串、怎么把 JSON 字符串解析回来。
【JSON小白篇】数据交换的通用语言—JSON
发布时间:2026/5/27 7:09:48
不管你用什么语言写后端前端发过来的数据大概率长这样{username: zhangsan, password: 123456}。这就是 JSON。 打开任何一个 Web API 的文档请求和响应的格式几乎都是 JSON。配置文件是 JSON数据库里存的结构化文本是 JSON前后端之间传来传去的还是 JSON。这篇把 JSON 格式本身讲清楚它是什么、有哪些规则、为什么它成了事实标准。一、JSON介绍1.1 JSON是什么 JSONJavaScript Object Notation是一种纯文本格式用来表示结构化数据。长这样{name:zhangsan,age:28,skills:[Python,Flask],active:true} 虽然名字里带 JavaScript它确实是 2001 年从 JS 语法里提炼出来的但今天它早就不是任何语言的专属了。Python 有json模块Java 有 Gson/JacksonGo 有encoding/jsonRust 有 serde_json……几乎所有主流语言都内置或有成熟的 JSON 支持。 JSON 的全部内容就写在一页纸就够的规范里json.org这种极简是它能成为通用格式的根本原因。1.2 语法规则只有六种类型 JSON 的数据类型只有六种记住这张表就掌握了全部语法类型示例说明stringhello必须用双引号不能用单引号number42,3.14,-1整数或浮点数不支持0x、NaN、Infinitybooleantrue,false全小写不是True/Falsenullnull表示没有值不是None、不是nilarray[1, two, true]有序列表元素可以是任意类型object{key: value}键值对集合键必须是双引号字符串 整个 JSON 世界就建立在这六块积木上。没有日期类型、没有二进制类型、没有注释这些缺失是刻意为之的设计选择后面会讲为什么。 一个完整的例子六种类型全覆盖{user_id:1,username:zhangsan,email:null,active:true,scores:[95,87,92],profile:{bio:Backend developer,years:3}} object 和 array 可以任意嵌套所以 JSON 能表达很复杂的数据结构。但每个叶子节点最终都是 string、number、boolean 或 null。二、JSON规则 JSON 语法很宽松但有几条铁律不能违反违反了解析器会直接报错2.1 键必须是双引号字符串错误 ❌ {name: zhangsan} 错误 ❌ {name: zhangsan} 正确 ✅ {name: zhangsan} 这是和 JavaScript 对象字面量的最大区别。JS 里键可以不加引号JSON 里不行。2.2 字符串必须用双引号错误 ❌ {name: zhangsan} 正确 ✅ {name: zhangsan} 单引号在 JSON 里不合法。写 Python 的人特别容易踩这个坑Python 里单双引号等价JSON 里只认双引号。2.3 尾部不能有逗号错误 ❌ {name: zhangsan, age: 28,} 正确 ✅ {name: zhangsan, age: 28} 最后一个元素后面不能有逗号。很多语言JavaScript、Python、Go都允许尾逗号但 JSON 不行。2.4 不能有注释 JSON 不支持任何形式的注释没有//没有/* */没有#。 这是 JSON 发明者 Douglas Crockford 的刻意决定。他认为注释会导致解析复杂化和滥用比如把处理指令藏在注释里。如果你需要带注释的配置文件可以用 JSONCVS Code 在用的格式、YAML 或 TOML。2.5 顶层必须是一个值 一个合法的 JSON 文档顶层必须是上面六种类型之一。最常见的是 object{}或 array[]但一个单独的hello、42、true、null也是合法的 JSON。三、两种风格紧凑 vs 格式化 同一份数据可以有两种写法含义完全相同。3.1 紧凑风格 一行搞定没有多余空白{user_id:123,name:zhangsan,role:user}3.2 格式化风格 有缩进和换行人眼友好{user_id:123,name:zhangsan,role:user} JSON 规范不关心空白解析器看到{user_id:123}和{ user_id : 123 }认为是完全一样的数据。但空白会影响文本内容本身这在某些场景很关键。 比如对 JSON 文本做哈希或 Base64 编码时同一个 object紧凑格式和带空格的格式算出来的结果完全不同。多一个空格编码就对不上。3.3 什么时候用哪种读者是机器就紧凑读者是人就格式化。场景选哪种原因API 请求/响应体紧凑省带宽客户端收到后自己解析不需要好看存进 Redis / 数据库紧凑十万条数据每条多几个空格就是几 MB 内存签名、哈希、Base64 编码紧凑多一个空格结果就变了格式必须固定package.json等配置文件格式化要用编辑器打开手动改不好看就没法维护日志输出格式化线上排查问题时需要快速肉眼定位字段调试时 print 出来看格式化紧凑的一坨字符串根本读不动四、JSON 为什么赢了 在 JSON 之前数据交换的主流格式是 XMLusernamezhangsan/nameage28/ageskillsskillPython/skillskillFlask/skill/skillsactivetrue/active/user 同样的数据用 JSON{name:zhangsan,age:28,skills:[Python,Flask],active:true} 差别一目了然JSONXML可读性接近自然语言标签噪音大体积紧凑开闭标签占大量空间解析速度快结构简单慢需要处理属性、命名空间等数据类型原生区分 string/number/boolean全是字符串类型靠约定学习成本5 分钟需要理解 DTD、Schema、XPath… XML 不是没有优势它支持注释、命名空间、混合内容文本和标签穿插在文档标记领域HTML 就是 XML 的近亲依然无可替代。但对于两个程序之间传结构化数据这个场景JSON 用更少的字符做到了同样的事。 2005 年之后随着 AJAX 和 REST API 的普及JSON 迅速取代 XML 成为 Web API 的事实标准。今天你打开任何一个公开 API 的文档返回格式几乎都是 JSON。五、JSON 在哪里 JSON 不是某一个环节的专属工具它渗透在整个技术栈里。从用户点击按钮到数据落盘中间流转的大概率都是 JSON。 知道了语法再看看你日常开发中哪些地方其实已经在跟 JSON 打交道了可能比你想的多得多。5.1 API前后端之间的普通话 你用浏览器登录一个网站点击登录按钮浏览器发出去的请求体长这样{username:zhangsan,password:123456} 服务器处理完返回的响应体也是 JSON{code:200,message:登录成功,token:eyJhbGciOi...} 这就是 REST API 的日常请求是 JSON响应也是 JSON。打开 GitHub、微信、支付宝的开放平台文档接口格式清一色都是它。5.2 配置文件程序的说明书 用过 VS Code 的都见过settings.json写过前端项目的都改过package.json用 TypeScript 就有tsconfig.json。这些配置文件选 JSON 的原因很简单结构清晰、所有语言都能解析、不需要额外装库。{name:my-project,version:1.0.0,scripts:{dev:vite,build:vite build}} 不过 JSON 不支持注释这一点在配置场景里确实不方便所以 VS Code 实际用的是 JSONCJSON with Commentstsconfig.json也允许注释。严格来说它们不是标准 JSON但解析器做了兼容。5.3 数据库不只是关系型的世界 MongoDB 整个数据模型就建立在类 JSON 的文档结构上存进去的每条数据就是一个 JSON object。PostgreSQL 有专门的jsonb字段类型可以直接在 SQL 里查询 JSON 内部的键值。Redis 的值是字符串实际项目中存的往往就是 JSON 序列化后的结果。-- PostgreSQL直接查 JSON 里的字段SELECTdata-usernameFROMusersWHEREdata-roleadmin;5.4 日志给机器看的也是 JSON 传统日志是一行行自由文本人能读但机器很难解析。现代日志系统ELK、Loki、CloudWatch越来越多地采用结构化日志每条日志就是一个 JSON object{timestamp:2026-03-26T08:30:00Z,level:ERROR,service:auth,message:token expired,user_id:123} 好处是显而易见的可以按level过滤、按service聚合、按user_id追踪不需要写正则去文本里捞信息。六、总结JSON 是纯文本格式只有六种数据类型string、number、boolean、null、array、object键必须用双引号字符串、尾部不能有多余逗号、不能含注释规则少但严格紧凑和格式化两种风格含义相同但文本内容不同影响编码和签名它赢了 XML因为更简单、更轻量、解析更快在 Web 开发中JSON 不是某个具体技术的附属而是数据交换的通用语言 知道了 JSON 是什么下一步就是用代码操作它怎么把程序里的数据结构转成 JSON 字符串、怎么把 JSON 字符串解析回来。