科学 JSON 数据 (.json)

RFC 标准

JavaScript Object Notation (JSON) 是一种轻量级、人类可读的文本数据交换格式,完全独立于语言,广泛应用于 Web API。

将 JSON 转换为 HTML

免费的浏览器端 JSON 转 HTML 转换器。在您的设备上即时转换文件。

在线压缩 JSON

隐私保护 - 文件不会离开您的设备

检查与元数据

操作系统和文件分析器通过检查开头的二进制字节序列来识别 JSON 文件:

选择或将文件拖放到此处

隐私保护 - 文件不会离开您的设备

或粘贴 Ctrl+V
零网络传输隐私保证: 上传至外部服务器的数据为 0 字节。所有处理均在您的浏览器沙箱中本地完成。

字节级文件头签名 (魔数)

操作系统和文件分析器通过检查开头的二进制字节序列来识别 JSON 文件:

十六进制签名 (偏移量 0):

7B 或 5B

ASCII 表示形式: { 或 [

标准化: RFC 8259 / ECMA-404 / ISO/IEC 21778

技术规格

容器架构轻量级、基于文本、独立于语言的数据交换格式
压缩方式Gzip / Brotli / Zstandard 文本压缩(通常可实现 80%-90% 的压缩率)
字节序UTF-8 编码的 Unicode(建议不包含字节顺序标记 / BOM)
色彩空间不适用
通道与结构六种基本数据类型:对象、数组、字符串、数字、布尔值、null
最大尺寸无限制;仅受解析器内存和最大字符串长度的限制
透明度不适用
流式传输与渐进式加载NDJSON(换行分隔的 JSON)/ JSON Lines 支持渐进式流处理

技术对比矩阵:JSON 对比同类产品

技术属性JSON (当前)YAMLXMLProtocol 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__ 属性。

历史渊源与里程碑

2017RFC 8259 将 UTF-8 标准化为 JSON 唯一的强制字符编码。
2013ECMA-404 定义了 JSON 语法,许多编程语言和平台都在使用它。
2001Douglas Crockford 指定了 JSON 规范,以实现无状态的浏览器到服务器数据通信。

核心优势与特点

  • 人类可读、自描述且简洁的文本结构。
  • 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 记录,从而能够对数吉字节的庞大数据集进行内存高效的逐行流处理。