惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

T
Threatpost
aimingoo的专栏
aimingoo的专栏
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
T
Tailwind CSS Blog
J
Java Code Geeks
博客园_首页
Google Online Security Blog
Google Online Security Blog
Hugging Face - Blog
Hugging Face - Blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
I
Intezer
P
Palo Alto Networks Blog
V
Vulnerabilities – Threatpost
雷峰网
雷峰网
O
OpenAI News
SecWiki News
SecWiki News
小众软件
小众软件
酷 壳 – CoolShell
酷 壳 – CoolShell
美团技术团队
N
News | PayPal Newsroom
Project Zero
Project Zero
Forbes - Security
Forbes - Security
IT之家
IT之家
A
Arctic Wolf
WordPress大学
WordPress大学
Jina AI
Jina AI
T
Tor Project blog
博客园 - 三生石上(FineUI控件)
S
Secure Thoughts
Google DeepMind News
Google DeepMind News
Attack and Defense Labs
Attack and Defense Labs
博客园 - 聂微东
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
P
Privacy International News Feed
Cloudbric
Cloudbric
G
GRAHAM CLULEY
博客园 - 叶小钗
H
Hacker News: Front Page
腾讯CDC
量子位
Help Net Security
Help Net Security
人人都是产品经理
人人都是产品经理
C
Cyber Attacks, Cyber Crime and Cyber Security
月光博客
月光博客
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
宝玉的分享
宝玉的分享
爱范儿
爱范儿
L
Lohrmann on Cybersecurity
Hacker News - Newest:
Hacker News - Newest: "LLM"
Recorded Future
Recorded Future
C
CERT Recently Published Vulnerability Notes

博客园_首页

Linux实操--组管理、权限管理和定时任务 Java + EasyExcel 实现单个接口导出多个Excel Mem0 源码解析系列(二):提示词工程的深度剖析 Openclaw TaskFlow究竟是什么?和普通Skill技能有什么区别 博文阅读密码验证 - 博客园 嘉立创开源:应该是全网MicroPython教程最多的开发板 Hermes Agent 集成实践:从协议到生产 2026年AI编程工具横评:Cursor、Codex、Claude Code、Zed、Windsurf Java程序员必看的RAG入门教程 2026 AI效率神器:Superpowers + Claude Code 保姆级教程 本地大模型部署全攻略:从 0 到 1 玩转 Ollama 【从0到1构建一个ClaudeAgent】内存管理-上下文压缩 .NET 高级开发 | 设计、实现一个事件总线框架 电子小白入门之NE555 3. WorkBuddy:隐藏玩法,一键召唤专家,让 AI 以"专家身份"给你干活 和AI一起搞事情#3:Claude Teammate 游戏开发翻车实录 【OpenClaw】通过 Nanobot 源码学习架构---(7)Memory C# .NET 周刊|2026年3月3期 我在 Debian 11 上把 K8s 单机搭起来了,过程没你想的那么顺(/opt 目录版) 深度学习进阶(七)Data-efficient Image Transformer CLI+Skill搭建浏览器AI自动化框架,告别一切重复枯燥任务 告别Token账单无底洞:OpenClaw本地部署,重塑企业数据主权的唯一解 FastAPI+Vue:文件分片上传+秒传+断点续传,这坑我帮你踩平了! SBTI 爆火后,我做了个程序员版的 CBTI。。已开源 + 附开发过程 多模态检索开始进入工程期:用 Sentence Transformers 搭建可落地的 Multimodal RAG 100多行代码实现一个最简单的Agent(用ReAct) Claude Code 通关手册(八):推荐 5 个 Hooks,代码质量提升 3 倍 老板:“有人截图了!”。安全部门:“收到,马上查暗水印!” - why技术 技术之外,皆是人间 C#/.NET/.NET Core技术前沿周刊 | 第 69 期(2026年4.01-4.12) Snack JSONPath 项目架构分析 Claude Code Buddy 小析:一个非核心功能,如何体现产品的细节完成度 AI新时代下的图床管理方案-Cloudflare图床+MCP+Skills方案指南 化繁为简:顺丰速运App如何通过 HarmonyOS SDK实现专业级空间测量 从零实现富文本编辑器#13-React非编辑节点的内容渲染 AI开发-python-langchain框架(3-23-OpenAI Functions风格Tool Calling智能助手) .NET + AI 进阶实战:基于类的技能开发 - 打造可治理的 Agent 能力模块 【从0到1构建一个ClaudeAgent】规划与协调-技能 上周热点回顾(4.6-4.12) 电子小白的工具三件套:面包板、杜邦线、万能板 单表五亿数据的查询优化 | Mysql、StarRocks 2. WorkBuddy:从“我是谁”到“帮我干活” C# 如何减少代码运行时间:7 个实战技巧 基于HelixToolkit.SharpDX 渲染3D模型 - 笺上知微 从零开始的双臂具身VLA起源及现阶段发展综述 - SkyXZ 记对 xonsh shell 的使用, 脚本编写, 迁移及调优 - pluvium27 受够了Vibe Coding的失控?换个起点,让AI事半功倍 从开始配置漏洞环境到漏洞复现流程 - 難しい 关于10年工作经验的程序员对OpenClaw的实战经验分享以及看法 - 虚无境 Any metadata 的内存布局 C# .NET 周刊|2026年3月2期 - InCerry 我帮你测过了,测试圈排名第二的 Skill 依然很牛逼 Skill Discovery | 无监督技能发现的经典工作总结 - MoonOut PbootCMS 网站内容数量多导致访问慢?这些实用优化方案帮你提速! - 家兴网络技术工作室 上下文工程是什么?过时了么?一文讲明白! - 一枫说码 网站漏洞怎么发现并修复?一篇实用指南(附完整流程) - 家兴网络技术工作室 开了 TUN 模式还是直连?90% 的人都踩过这个坑 Github日报|2026年04月12日 - AI一族 AScript扩展多种脚本语言 - rockey627 AI 学习笔记:Agent 的记忆机制 你能被装进一个文件里吗?——7 万人把同事"蒸馏"成了 AI - 我没有三颗心脏 Claude Code 通关手册(七):给 AI 装上技能包——Skills 完全指南 - 暮色之狐 在浏览器中快速编辑代码:VSCode Web 集成实践 - Newbe36524 蒸馏自己 skill?基于 Deepseek 的蒸馏器,丐版蒸馏方式,简单便捷 - To_Carpe_Diem Spring AI Aliababa和AgentScope,哪个更好? - 苏三说技术 Etsy 把 1000 个 MySQL 分片迁进 Vitess:425TB 数据背后的真正问题不是性能,而是运维规模 MicroPython LVGL基础知识和概念:底层渲染与性能优化 - FreakStudio 数据库草图算法 Python 潮流周刊#146:CPython 引入 Rust 的进展 - 豌豆花下猫 最小生成树 - mofei1116 红日靶场七:从外网入口、容器逃逸到 AD 接管的完整利用链复盘 - YouDiscovered1t 分享四款开源且实用的 Kafka 管理工具 - 追逐时光者 vLLM 权重加载机制全解析:从挑战到理想架构 LCT 学习笔记 - ACehomoxue Avalonia UI 12.0.0 正式发布:架构演进和性能飞跃 - 张善友 当 AI Agent 把调用链拉长,延迟开始成为一门生意 conhost.exe 无法显示 U+2717 - 145a 太秀了,我把自己蒸馏成了 Skill!已开源 - 程序员鱼皮 ASP.NET Core 内存缓存实战:一篇搞懂该怎么配、怎么避坑 基于 Ghostty 带有分割标签页和为 Claude 编程设计的通知终端 - BugShare AI 焊死入口:教育的“操作系统级”重塑 - 郝hai 初级Java开发工程师使用sql脚本编写代码的过程是简单而且不糊涂 - CoderOilStation Claude Code通关手册(六):MCP协议完全指南 - 暮色之狐 边框灯光环绕动画特效实现指南 - Newbe36524 开源:子木蒸馏版的 SEO 审计工具 seo-audit-skill v1.0 我所理解的Python元模型 【从0到1构建一个ClaudeAgent】规划与协调-TodoWrite - 程序员Seven Claude 和 Codex 在审计 Skill 上性能差异探究 - ACai_sec AScript如何实现中文脚本引擎 - rockey627 【渗透测试】HTB Season10 Garfield 全过程wp - dynasty_chenzi Android 开发者为什么必须掌握 AI 能力?端侧视角下的技术变革 树状数组正确性证明 - AC-wyr 你的 AI 焦虑,可能比 AI 本身更危险——ATM 机没有消灭银行柜员,但恐慌消灭了你的判断力 - 我没有三颗心脏 一个拉胯的分库分表方案有多绝望?整个部门都在救火! - 冰河团队 动态规划入门必学之走方格问题 - Ofnoname PostgREST 与 PostgreSQL 角色权限配置全解析(生产级实践) - SheepDog1998 使用 UEFI 图形输出协议 GOP 在屏幕上显示图像的方法 - 阿源- Claude Code通关手册(五):组建你的AI专家团队,子代理系统 - 暮色之狐 一个程序员到架构师的催婚路之感悟(整整10年后的催婚相亲感悟) - MisterLip 用 Agent Skill 自动生成工作周报 - 赵康
JSON 数据格式
木三百川 · 2026-05-06 · via 博客园_首页

说明

学习 JSON 数据格式时整理的学习笔记。


1. JSON 简介

JSON(JavaScript Object Notation,JavaScript 对象表示法)起源于 JavaScript 语言,是一种轻量级的数据交换格式。 它由键值对组成,采用完全独立于编程语言的文本格式,易于人阅读和编写,同时也易于机器解析和生成,常用于前后端之间的数据交换以及配置信息的存储NoSQL 数据库的数据存储

1.1 JSON 的发展经历

  • 1999年,道格拉斯·克罗克福德(Douglas Crockford)敏锐地意识到,JavaScript 中定义对象的字面量语法可以作为一种优秀的数据串行化格式,这个语法定义来源于标准 Standard ECMA-262 3rd Edition - December 1999。
  • 2001年,道格拉斯·克罗克福德首次在 https://www.json.org 上正式说明和推广这种格式,并将其命名为 JSON。
  • 2002-2005年,在 Web 开发社区中,人们发现,使用 JSON 作为数据交换格式,可以避免 Ajax(Asynchronous JavaScript and XML)技术中复杂的 XML 解析,JSON 逐渐取代 XML 成为 Web 应用程序数据交换的主流格式。
  • 2006年7月,IETF(Internet Engineering Task Force,互联网工程任务组)发布 JSON 的第一个官方互联网标准 RFC4627,道格拉斯·克罗克福德是主要作者,该标准将 JSON 的 MIME 类型定义为 application/json
  • 2013年10月,ECMA International(European Computer Manufacturers Association,欧洲计算机制造商协会)发布 JSON 的第一个国际技术标准 ECMA-404,这是一个简洁的、仅描述语法的标准,不涉及具体编码或解析行为,强调了 JSON 的语言无关性。
  • 2014年3月,IETF 依次发布 RFC7158 和 RFC7159,更新了 RFC4627,指出 JSON 文本的最顶层可以是任何 JSON 值(而不仅仅是对象或数组)。
  • 2017年12月,IETF 发布 RFC8259,这是当前最新的官方标准,指出 JSON 文本必须强制性使用 UTF-8 编码,消除之前的编码歧义,确保绝对的互操作性。同月,ECMA International 发布第二版 ECMA-404,澄清术语与措辞,对齐 RFC8259 标准。

1.2 JSON 标准规范

JSON 有两个标准规范,分别是由 IETF 发布的 JSON 互联网标准、由 ECMA International 发布的 JSON 国际技术标准,两者在语法规则上完全一致,开发者无需区分两者,实际应用中遵循任一标准均可。

1.2.1 互联网标准

由 IETF(Internet Engineering Task Force,互联网工程任务组)发布,是互联网标准文档,注重 JSON 在互联网传输中的应用,常用于互联网协议(如 HTTP API),历次标准如下:

1.2.2 国际技术标准

由 ECMA International(European Computer Manufacturers Association,欧洲计算机制造商协会)发布,是国际技术标准,内容更为简洁,仅描述 JSON 的语法定义和合法性规则,不涉及具体实现方式,常作为基础规范被编程语言和工具引用,历次标准如下:


2. JSON 语法

2.1 基本规则

  • JSON 文本必须是 UTF-8 编码。源于 RFC8259 标准规定,ECMA-404 标准虽未强制规定编码方式,但实际实现通常遵循 RFC8259 的 UTF-8 要求。
  • JSON 文本的顶层元素可以是对象数组。虽然 RFC7158 及其后续标准指出 JSON 文本的最顶层可以是任何 JSON 值(而不仅仅是对象或数组),实际应用中不满足这个条件时可能会报错。
  • JSON 文本的名称 - 值对中的值必需是以下六种基本数据类型之一。
    • 对象(用 {} 包裹):名称 - 值对的无序集合
    • 数组(用 [] 包裹):值的有序集合
    • 字符串(用 "" 包裹):文本数据。
    • 数字:支持整数、小数、科学记数法。
    • 布尔值:true 或 false。
    • null:表示空值。

2.2 名称 - 值对

JSON 名称 - 值对是 JSON 中最基本的结构之一,它表示了一个名称和对应的值之间的关系,如下所示:

"key": value
  • 其中 "key" 就是名称,是一个字符串,必需用英文双引号 " 括起来。
  • 其中 value 就是值,值必需是对象、字符串、数字、布尔值、null 和数组这六种数据类型之一,当且仅当值是字符串类型时需要用英文双引号括起来。
  • 必需使用英文冒号 : 来分隔名称和值,名称始终在左侧,值始终在右侧。

名称字符串可以是任何有效的字符串,以下字符串在 JSON 中作为名称都是合法的,但为了获得最大可移植性,应尽可能避免使用空格和特殊字符,最好仅使用英文字母 A~Z 或 a~z。

"MyAnimal"
"My Animal"
" My Animal "
"+-*/!@#$%^&,()=_[]MyAnimal"
"Lindsay'sAnimal"
"李华"

下面例举名称字符串中出现反斜杠、双引号、控制字符、Unicode 转义字符这些典型特殊字符的例子,实际应用时不推荐这样做。

2.2.1 名称字符串中的反斜杠

名称字符串中无法单独使用反斜杠 \,需搭配转义字符 \ 使用,以下使用是合法的:

"My\\Atimal"

2.2.2 名称字符串中的双引号

名称字符串中无法单独使用英文双引号 ",需搭配转义字符 \ 使用,以下使用是合法的:

"My\"Atimal"

2.2.3 名称字符串中的控制字符

名称字符串中出现 \t\r\n\f\b 等控制字符是合法的,以下使用是合法的:

"My\tAtimal"
"My\rAtimal"
"My\nAtimal"
"My\fAtimal"
"My\bAtimal"

2.2.4 名称字符串中的 Unicode 转义字符

名称字符串中出现 \uXXXX(四位十六进制表示)Unicode 转义字符是合法的,以下使用是合法的:

"MyAtimal\u263A"

2.3 JSON 的六个结构字符

以下六个结构字符在不作为字符串组成部分时告诉机器如何读取数据,这六个结构字符之前或之后可以使用空格、缩进、换行符等空白字符而不影响 JSON 语义:

  • { 左花括号表示“开始读取对象”;
  • } 右花括号表示“结束读取对象”;
  • [ 左方括号表示“开始读取数组”;
  • ] 右方括号表示“结束读取数组”;
  • : 英文冒号表示“在名称 - 值对中分隔名称和值”;
  • , 英文逗号表示“分隔对象中的名称 - 值对”或者“分隔数组中的值”,表示“一个新部分的开始”。

2.4 JSON 注释

JSON 不支持添加注释。

2.5 JSON 格式化

计算机生成的 JSON 数据通常是不易于人直接阅读的,如下所示,这种紧凑的格式去除了多余的空格、缩进和换行符,使得数据体积更小,传输时占用更少的带宽、存储时占用更小的容量。

{"date":"22","ymd":"2018-09-22","week":"星期六","sunrise":"05:57","high":"高温 26.0℃","low":"低温 15.0℃","sunset":"18:10","aqi":55,"fx":"西北风","fl":"4-5级","type":"晴"}

JSON 格式化是指将 JSON 数据按照一定的格式排列,适当添加空格、缩进和换行符,使其更易于人阅读和理解,如下是对上述 JSON 数据格式化的结果。

{
  "date": "22",
  "ymd": "2018-09-22",
  "week": "星期六",
  "sunrise": "05:57",
  "high": "高温 26.0℃",
  "low": "低温 15.0℃",
  "sunset": "18:10",
  "aqi": 55,
  "fx": "西北风",
  "fl": "4-5级",
  "type": "晴"
}

2.6 JSON 语法验证

JSON 语法验证用于检测 JSON 语法是否正确:是否被花括号包裹,名称 - 值对是否以英文逗号分隔,名称和值之间是否以英文冒号分隔,左右括号是否成对匹配,等等。网上有很多在线的 JSON 语法验证工具,提供以下几个示例网站,可自行搜索。


3. JSON 数据类型

JSON 中的数据类型包括:对象类型(object)、字符串类型(string)、数字类型(number)、布尔类型(boolean)、null 类型(null)、数组类型(array)这六种。

3.1 对象类型(object)

JSON 对象是名称 - 值对的无序集合,语法如下:

  • JSON 对象由 {} 包裹。
  • \(\geq0\) 个名称 - 值对组成。
  • 名称 - 值对之间用英文逗号 , 分隔。
  • 同一对象中名称可以重复,但不推荐这么做,标准 ECMA-404 和 RFC8259 明确写了名称不要求唯一,但是不同程序对重复名称的处理方式不同。

示例:

{
  "name": "Alice",
  "age": 25,
  "isStudent": false,
  "hobbies": ["reading", "traveling"]
}

3.2 字符串类型(string)

JSON 中的字符串可以由任何 Unicode 字符构成,字符串的两边必须被英文双引号包裹。以下字符需搭配转义字符 \ 使用才能表达其自身含义:

  • " 英文双引号,需写为 \",否则不合语法。
  • \ 反斜杠,需写为 \\,否则不合语法。
  • / 正斜杠,需写为 \/,否则实际效果可能和预期不一致,与编程语言以及具体实现有关。
  • \b 退格符,需写为 \\b,否则实际效果可能和预期不一致,与编程语言以及具体实现有关。
  • \f 换页符,需写为 \\f,否则 实际效果可能和预期不一致,与编程语言以及具体实现有关。
  • \n 换行符,需写为 \\n,否则 实际效果可能和预期不一致,与编程语言以及具体实现有关。
  • \r 回车符,需写为 \\r,否则 实际效果可能和预期不一致,与编程语言以及具体实现有关。
  • \t 制表符,需写为 \\t,否则 实际效果可能和预期不一致,与编程语言以及具体实现有关。
  • \uXXXX(四位十六进制表示)Unicode 转义字符,需写为 \\uXXXX,否则实际效果可能和预期不一致,与编程语言以及具体实现有关。

示例,下面字符串类型数据都是合法的,但产生的实际效果可能不同:

{
  "saying": "Einstein once said, \"Imagination is more important than knowledge.\"",
  "dataPath": "E:\\NoteBook",
  "equationA": "10/5=2",
  "equationB": "10\/5=2",
  "storyA": "\t Once upon a time\b\f\r, in a far away land \n there lived a princess.\u263A",
  "storyB": "\\t Once upon a time\\b\\f\\r, in a far away land \\n there lived a princess.\\u263A"
}

在 MATLAB 中使用 jsondecode() 搭配 fileread() 进行测试,结果如下:

  • 正斜杠 / 写为 / 或者 \/ 时,两种写法解析出来的字符串是相同的,具体为字符串打印效果相同、字符串长度相同、字符串各字符对应相同。

  • 退格符 \b 写为 \b 或者 \\b 时,两种写法效果不同:

    • 写为 \b 时,字符长度计数为 1,打印时产生退格效果,后一字符会替代前一字符;
    • 写为 \\b 时,字符长度计数为 2,打印时显示 \b 字面值,无退格效果。
  • 换页符 \f 写为 \f 或者 \\f 时,两种写法效果不同:

    • 写为 \f 时,字符长度计数为 1,打印时显示带阴影的 FF 单字符;
    • 写为 \\f 时,字符长度计数为 2,打印时显示 \f 字面值,无其他效果。
  • 换行符 \n 写为 \n 或者 \\n 时,两种写法效果不同:

    • 写为 \n 时,字符长度计数为 1,打印时产生换行效果;
    • 写为 \\n 时,字符长度计数为 2,打印时显示 \n 字面值,无换行效果。
  • 回车符 \r 写为 \r 或者 \\r 时,两种写法效果不同:

    • 写为 \r 时,字符长度计数为 1,打印时产生换行效果;
    • 写为 \\r 时,字符长度计数为 2,打印时显示 \r 字面值,无换行效果。
  • 制表符 \t 写为 \t 或者 \\t 时,两种写法效果不同:

    • 写为 \t 时,字符长度计数为 1,打印时产生缩进效果;
    • 写为 \\t 时,字符长度计数为 2,打印时显示 \t 字面值,无缩进效果。
  • Unicode 转义字符 \u263A 写为 \u263A 或者 \\u263A 时,两种写法效果不同:

    • 写为 \u263A 时,字符长度计数为 1,打印时产生笑脸字符;
    • 写为 \\u263A 时,字符长度计数为 6,打印时显示 \u263A 字面值,无笑脸字符。

3.3 数字类型(number/integer)

JSON 中的数字可以是整数、小数或者指数,不支持 NaNInfinity 等特殊数值字面量。

  • integer 类型:整数。
  • number 类型:整数、小数或者指数。

示例:

{
  "integer": 42,
  "negative": -42,
  "float": 3.14159,
  "double": 3.141592653589793,
  "scientificA": 6.022e+23,
  "scientificB": 6.022E+23
}

由于计算机使用 IEEE754 标准存储浮点数,该标准以有限位数的二进制形式近似表示十进制数值,导致超范围的数值和某些十进制小数无法精确存储,数字文本与数值相互转换的过程中可能会产生误差丢失精度。示例:

  • 数字文本 3.141592653589793238462643383279 有效位数过多,解析为 double 时只能存储 3.141592653589793 共 16 位有效位数,后续小数会丢失。
  • 数字文本 1E400 数值过大,超过 double 能表示的范围(约 \(-1.79E+308\)\(+1.79E+308\)),可能无法正确解析,在 MATLAB 中会被解析为 Inf 无穷大。

3.4 布尔类型(boolean)

JSON 中的布尔值只能是 truefalse,严格小写,任何其他形式的写法都不合语法。示例:

{
  "isActive": true,
  "isDeleted": false
}

3.5 null 类型(null)

JSON 中 null 是一个表示没有值(空值)的值,严格小写,任何其他形式的写法都不合语法。示例:

{
  "optionalField": null
}

3.6 数组类型(array)

JSON 数组是值的有序集合,语法如下:

  • JSON 数组由 [] 包裹。
  • \(\geq0\) 个值组成。
  • 值之间用英文逗号 , 分隔。
  • 值必需是对象、字符串、数字、布尔值、null 和数组这六种数据类型之一。
  • 值可以是不同的数据类型,标准中未做约束,但为了获得最大可移植性,应尽量使用相同的数据类型。

示例:

[
  "hello",
  42,
  true,
  null,
  {"name": "Alice"},
  [1, 2, 3]
]

4. JSON Schema 模式校验

JSON Schema 用来对 JSON 数据进行模式校验、数据一致性校验。前面提到的 JSON 语法验证只能用于检测 JSON 语法是否正确,而 JSON Schema 可以用来检验给定的 JSON 数据是否满足更具体的使用要求:

  • 是否包含所需要的数据?可以规定哪些数据(名称 - 值对)是必需包含的,哪些数据是可选的。
  • 值的数据类型是否正确?可以规定指定名称下值的数据类型。
  • 值的形式是否满足约束规则?可以规定指定名称下值的取值范围、最小值、最大值等。

4.1 JSON Schema 规范

2007 年克里希普(Kris Zyp,Chris Zyp)提出 JSON Schema 用于 JSON 文本模式校验,2009年12月,JSON Schema 规范以 IETF 互联网草案 Draft 0Draft 1 的形式首次面世,但并未成为正式的 IETF 标准,随后的十余年间,JSON Schema 在社区的驱动下,经历了多个关键的发展阶段和领导团队。截至目前,JSON Schema 规范仍作为一个独立的由社区驱动的开源项目,任何人都可以参与讨论和贡献,尽管没有正式的管理组织,JSON Schema 早已是业界公认的事实标准。最新的稳定规范草案为 2020-12 版本,历次发布版本详见 JSON Schema - Specification Links。各规范的详细内容详见对应链接:

  • 2009年12月5日,发布 Draft 0
  • 2009年12月5日,发布 Draft 1,修复错误并取代当天发布的 Draft 0
  • 2010年3月23日,发布 Draft 2
  • 2010年11月22日,发布 Draft 3
  • 2013年1月31日,发布 Draft 4
  • 2016年10月13日,发布 Draft 5
  • 2017年4月21日,发布 Draft 6
  • 2018年3月19日,发布 Draft 7
  • 2019年9月17日,发布 Draft 2019-09,也称 Draft 8
  • 2022年6月16日,发布 Draft 2020-12,为当前最新规范。

4.2 JSON Schema 使用示例

使用 JSON Schema 进行模式校验时,通常分为以下三步:

  1. 定义 Schema:编写 JSON Schema,这是一个 JSON 对象,用于描述数据的期望结构。
  2. 验证数据:使用验证库将 JSON 数据与 Schema 对比,检查是否符合约束,这一步与编程语言以及具体实现有关,C++ 开发者可以参考 从零吃透 JSON Schema 2020-12:C++ 开发者专属实战指南-CSDN博客
  3. 处理验证结果:如果验证失败,则返回验证失败的详细信息(缺失字段、类型错误等)。

一个简单的 JSON Schema 示例:

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "name": { "type": "string" },
    "age": { "type": "integer", "minimum": 0 },
    "email": { "type": "string", "format": "email" }
  },
  "required": ["name", "email"],
  "additionalProperties": false
}

此 Schema 描述一个 JSON 对象,表达含义如下:

  • 当前 Schema 语法遵循 Draft 2020-12 版本规范。
  • 顶层数据类型必需为对象类型(object)
  • 名称 name 下值的数据类型必需为字符串类型(string)
  • 名称 age 下值的数据类型必需为整数类型(integer),且值不小于 0,也就是非负整数。
  • 名称 email 下值的数据类型必需为字符串类型(string),且必需符合 email 格式。
  • 名称 nameemail 是必需包含的,不能省略。
  • 不允许包含 nameageemail 这三个名称之外的其他名称 - 值对。

验证成功的、符合此 Schema 的 JSON 数据示例一:

{
  "name": "Alice",
  "age": 25,
  "email": "alice@example.com"
}

验证成功的、符合此 Schema 的 JSON 数据示例二:

{
  "name": "Alice",
  "email": "alice@example.com"
}

验证失败的、不符合此 Schema 的示例一(age 值小于 0,email 值不符合 email 格式):

{
  "name": "Bob",
  "age": -5,
  "email": "invalid-email"
}

验证失败的、不符合此 Schema 的示例二(包含了 nameageemail 这三个名称之外的名称 weight):

{
  "name": "Alice",
  "age": 25,
  "email": "alice@example.com",
  "weight": 56
}

验证失败的、不符合此 Schema 的示例三(没有包含必需名称 email):

{
  "name": "Alice"
}

4.3 JSON Schema 工具网站

提供以下几个 JSON Schema 工具网站:


参考资料

[1] 美 巴塞特 Bassett, Lindsay.JSON必知必会[M].人民邮电出版社,2016.

[2] Introducing JSON.

[3] JSON Schema (json-schema.org).

[4] 开发爱好者 - JSON 概述与历史.

[5] JSON传奇:从偶然诞生到统治Web的数据交换之王 (zeeklog.com).

[6] JSON的发展历史:从JavaScript到跨语言数据交换标准 - WeJSON博客.

[7] JSON标准及语法介绍 | TT工作室 (snownight22.github.io).

[8] JSON基础知识与实践:轻松理解并应用JSON格式-腾讯云开发者社区-腾讯云 (tencent.com).

[9] JSON 文本语法格式_json格式要求-CSDN博客.

[10] JSON允许Key重复吗? - 知乎 (zhihu.com).

[11] 什么是 JSON Schema:描述和验证 JSON 数据结构与内容的标准规范-CSDN博客.

[12] 从零吃透 JSON Schema 2020-12:C++ 开发者专属实战指南_json schema 规范(中文版) 2020-12-CSDN博客.