科学 JSON 数据 (.json)
RFC 标准JavaScript Object Notation (JSON) 是一种轻量级、人类可读的文本数据交换格式,完全独立于语言,广泛应用于 Web API。
将 JSON 转换为 HTML
免费的浏览器端 JSON 转 HTML 转换器。在您的设备上即时转换文件。
在线压缩 JSON
隐私保护 - 文件不会离开您的设备
检查与元数据
操作系统和文件分析器通过检查开头的二进制字节序列来识别 JSON 文件:
字节级文件头签名 (魔数)
操作系统和文件分析器通过检查开头的二进制字节序列来识别 JSON 文件:
十六进制签名 (偏移量 0):
7B 或 5BASCII 表示形式: { 或 [
标准化: RFC 8259 / ECMA-404 / ISO/IEC 21778
技术规格
| 容器架构 | 轻量级、基于文本、独立于语言的数据交换格式 |
| 压缩方式 | Gzip / Brotli / Zstandard 文本压缩(通常可实现 80%-90% 的压缩率) |
| 字节序 | UTF-8 编码的 Unicode(建议不包含字节顺序标记 / BOM) |
| 色彩空间 | 不适用 |
| 通道与结构 | 六种基本数据类型:对象、数组、字符串、数字、布尔值、null |
| 最大尺寸 | 无限制;仅受解析器内存和最大字符串长度的限制 |
| 透明度 | 不适用 |
| 流式传输与渐进式加载 | NDJSON(换行分隔的 JSON)/ JSON Lines 支持渐进式流处理 |
技术对比矩阵:JSON 对比同类产品
| 技术属性 | JSON (当前) | YAML | XML | Protocol Buffers |
|---|---|---|---|---|
| 语法复杂度 | 极简(6 种类型,语法严格) | 高(基于缩进,规范复杂) | 高(冗长的闭合标签、命名空间) | 由 Schema 定义的二进制线上传输格式 |
| 解析性能 | 在所有现代语言中都极其迅速 | 慢(复杂的缩进解析) | 中等到慢(繁重的 DOM 构建) | 超快(零拷贝二进制反序列化) |
| 注释支持 | 无(故意排除以防止元数据膨胀) | 有(# 注释) | 有(<!-- 注释 -->) | 在 .proto 文件中有支持 |
| 网络有效负载大小 | 紧凑文本(极高的 gzip 压缩率) | 紧凑文本 | 冗长文本(重复的标签较多) | 超紧凑二进制 |
常见损坏模式与十六进制恢复指南
SyntaxError: Unexpected token , in JSON at position X.
根本原因: 数组或对象中最后一项后面有尾随逗号,这在 RFC 8259 JSON 中是严格非法的。
恢复方法: 在传递给 JSON.parse() 之前,请移除对象键和数组条目中的尾随逗号。
SyntaxError: Unexpected token ' in JSON.
根本原因: 字符串或键使用单引号 ('') 而不是双引号 ("") 包围。
恢复方法: 将所有单引号引起的字符串和键替换为标准的双引号字符串。
安全分析与解析器攻击向量
JSON 仅包含文本且免受直接代码执行威胁,但解析不受信任的 JSON 可能会导致原型污染(Prototype Pollution)、ReDoS 或内存耗尽。
已知攻击向量
- 原型污染:名为 '__proto__' 或 'constructor' 的键会修改 JavaScript 应用程序中的 Object.prototype。
- 通过深度嵌套的 JSON 结构(例如 10,000 个开括号)导致的栈溢出拒绝服务攻击。
- 数字精度丢失:大于 2^53 - 1 (9,007,199,254,740,991) 的 JavaScript 数字会静默丢失精度。
防御性最佳实践: 切勿使用 eval() 执行 JSON。请使用 JSON.parse(),并在递归对象合并函数中清理 __proto__ 属性。
历史渊源与里程碑
核心优势与特点
- 人类可读、自描述且简洁的文本结构。
- JavaScript 引擎(JSON.parse)及所有主流编程语言内置原生解析支持。
- 严格的规范可防止任意代码执行。
技术局限与劣势
- 不支持注释、尾随逗号或循环对象引用。
- 不支持原生二进制类型(二进制数据必须进行 base64 编码,体积膨胀 33%)。
- 与 Protocol Buffers 或 MessagePack 等二进制格式相比,序列化效率较低。
趣味技术冷知识
- Douglas Crockford 在最初的 JSMin JSON 工具中添加了软件许可条款"本软件应当用于善,而非恶"。
- JSON 是 JavaScript 语法的严格子集,但在 ES2019 之前,原始未转义的 U+2028 和 U+2029 字符在 JSON 中有效,但在 JavaScript 字符串中无效。
- Douglas Crockford 发现,在 ECMAScript 5 中标准化专门的 JSON.parse() API 之前,早期网络浏览器可以使用 JavaScript 的原生 eval() 直接将 JSON 评估为对象。
常见技术问题
为什么 JSON 不允许注释?
JSON 语法不允许注释。不同实现对扩展和应用专用数据的处理可能不同,因此仅凭格式本身无法保证互操作性。
如何在不丢失精度的情况下在 JSON 中存储 64 位整数?
JavaScript 的原生 Number 类型是 IEEE 754 双精度浮点数,它仅精确支持最大到 2^53 - 1 的整数。64 位整数(如数据库 ID 或时间戳)在 JSON 中必须序列化为字符串(例如 '1234567890123456789')。
JSON 与 NDJSON / JSON Lines 有什么区别?
标准 JSON 将整个有效负载包装在单个根对象或数组中,要求解析器在评估之前加载整个文本。NDJSON(换行分隔的 JSON)使用换行符(\n)分隔各个有效的 JSON 记录,从而能够对数吉字节的庞大数据集进行内存高效的逐行流处理。
相关的 JSON 转换对
将 JSON 数据转换为 HTML 源代码,将结构化的原始键值对转化为可供浏览器渲染的人类可读网页文档。
将 HTML 源代码转换为 JSON 数据,把人类可读的网页文档转化为便于程序处理和 API 接收的结构化键值对。
将 SQL 转储文本脚本转换为 JSON 数据导出,可将僵化的关系型数据库表转变为适合现代网络应用的灵活嵌套对象。
将非结构化的 JSON 文本文件转换为结构化的 SQLite 关系型数据库,以便对大型数据记录进行快速索引和查询。
将 Adobe Swatch Exchange 文件转换为颜色 JSON 结构,可将二进制设计调色板转化为适用于现代 Web 应用程序的可读文本对象。
将颜色 JSON 文本数据转换为 Adobe ASE 二进制色板,连接了基于 Web 的设计令牌与专业桌面排版应用程序。
将 GIMP 调色板文本文件转换为颜色 JSON 结构,使 Web 应用程序能够直接读取色板,而无需复杂的解析脚本。
将结构化的颜色 JSON 文件转换为 CSS 变量,将原始数据对象转换为网站的原生样式属性。