JSON-LD 是一种使用 JSON 表达关联数据的标准化格式。它增加了识别实体、建立实体间关联以及为特定于应用程序的属性名称赋予显式语义的机制。其语法与普通 JSON 工具完全兼容,而 JSON-LD 处理器则能进一步解析其中的语义信息。该格式支持在 Web 应用程序和互操作服务之间交换图结构数据。(w3.org)
发展与标准化
万维网联盟(W3C)于 2014 年 1 月 16 日将 JSON-LD 1.0 发布为正式推荐标准。其设计初衷是让关联数据能够无缝融入现有的 JSON 开发实践中,而无需采用完全不同的文档语法。(w3.org)
JSON-LD 1.1 于 2020 年 7 月 16 日成为 W3C 正式推荐标准。该规范族由三份文档组成:序列化语法、处理算法与应用程序编程接口(API)以及框架化(framing)。1.1 版本对 1.0 版本进行了扩展,规范中详细记录了相关兼容性例外。(w3.org)
数据模型与标识符
普通 JSON 可以描述对象、数组和基础值,但无法独立为对象键建立全局共享的含义。JSON-LD 通过上下文(context)来提供这种解释,将词项映射到国际化资源标识符(IRI)。因此,不同的应用程序可以为同一个属性使用不同的简写名称,或者区分具有相同名称但含义不同的属性。(w3.org)
由此产生的信息构成了一个有向图:节点代表实体,属性表示关系,而属性值既可以是字面量,也可以是对其他节点的引用。JSON-LD 能够序列化资源描述框架(RDF)图和数据集。其数据模型还包含一些扩展,这些扩展在转换为标准 RDF 时可能需要特殊处理;因此,JSON-LD 与 RDF 关系密切,但并不完全等同。(w3.org)
主要关键字包括:
| 关键字 | 功能 |
|---|---|
@context |
定义词项和值的解释方式。 |
@id |
标识一个节点,或表示对某一节点的引用。 |
@type |
根据所在位置指定节点的类型或字面量的数据类型。 |
@value |
引入一个显式的字面量值。 |
@language |
为字符串关联语言标签。 |
@graph |
对图内容进行分组;与标识符结合使用时,可描述一个命名图。 |
@list |
表示一个顺序至关重要的序列。 |
在关联数据模型中,普通的属性-值数组本身并不表达有序列表。(w3.org)
上下文与示例
上下文既可以直接包含在文档中,也可以通过远程方式引用。它们可以定义词表前缀、默认语言设置,以及特定字符串值是应被解释为标识符还是普通文本。(w3.org)
以下示例示例使用了本地定义的上下文和虚构的标识符:
{
"@context": {
"name": "https://example.org/vocab/name",
"knows": {
"@id": "https://example.org/vocab/knows",
"@type": "@id"
}
},
"@id": "https://example.org/people/alex",
"name": "Alex",
"knows": "https://example.org/people/sam"
}
在此处,name 表示由词表定义的属性。上下文中的 @type 设置使 knows 的值成为节点引用,而非单纯的 URL 文本字面量。因此,该文档描述了一个名为 Alex 的实体以及与另一个已知实体的关系。(w3.org)
1.1 版本增加了多项特性,包括属性级和类型级作用域的上下文、受保护的词项定义、上下文导入、文本方向元数据以及 JSON 值字面量。这些特性为面向应用程序的 JSON 结构与关联数据表示之间提供了更精细的映射支持。(w3.org)
处理操作
处理规范定义了若干转换操作:
- 展开(Expansion):将依赖上下文的词项解析为完整标识符和显式的值结构。
- 压缩(Compaction):应用指定的上下文,生成更短且面向应用程序的名称和结构。
- 扁平化(Flattening):将节点的描述收集为更规整的排列形式,减少对其原始嵌套层级的依赖。
- RDF 转换(RDF conversion):根据既定的转换规则在 JSON-LD 与 RDF 数据集之间进行互转。(w3.org)
独立规范的框架化(Framing)负责将图信息重构成所要求的 JSON 树状布局。框架可以选定主题并确定相关节点如何嵌套嵌入,使得习惯处理嵌套对象的应用程序更容易消费图状信息。框架化并不是一种通用的图查询语言。(w3.org)
这些操作将文档的语义内容与其表层排列区分开来:不同的 JSON 树结构可以表达同一个图。压缩和框架化提供了便捷的数据表示形式,但并未确立通用的规范化字节序列。(w3.org)
Web 发布与应用
JSON-LD 使用的媒体类型为 application/ld+json,常见文件扩展名为 .jsonld。它可以作为独立文档发布,也可以嵌入到 超文本标记语言(HTML)中 type 为 application/ld+json 的 script 元素内。这类元素包含的是数据,而非可执行的 JavaScript 代码。(w3.org)
一个突出的应用场景是使用 Schema.org 的 Web 结构化数据。Schema.org 提供词表词项,而 JSON-LD 提供编码和解释机制。两者不可混为一谈,JSON-LD 还可以使用其他词表,或同时组合多个词表。(schema.org)
Google 搜索支持 JSON-LD,并在其支持的结构化数据实现中推荐使用该格式。有效的标记并不保证一定会呈现为富媒体搜索结果:展示资格还取决于内容规范要求、特定功能规则以及搜索系统的决策。(developers.google.com)
局限性与安全性考量
JSON-LD 并不要求仅因为远程资源的标识符出现在数据中就去获取它们。然而,在处理过程中可能需要获取远程上下文。因此,远程上下文的可用性和内容会直接影响数据的解释;处理 API 提供了可配置的文档加载机制,并包含针对上下文加载失败的错误处理。(w3.org)
自动获取第三方上下文可能会暴露使用模式,从而引发数据隐私方面的担忧。JSON-LD 是一种数据交换格式,绝不能通过 JavaScript 的 eval() 等代码执行机制来进行解析。这些安全考量与文档是否正确表达了关联数据图是相互独立的。(w3.org)
参考来源
- JSON-LD 1.1w3.org
- JSON-LD 1.1 publication historyw3.org
- JSON-LD 1.0w3.org
- JSON-LD is a W3C Recommendationw3.org
- JSON-LD 1.1 Processing Algorithms and APIw3.org
- JSON-LD 1.1 Framingw3.org
- JSON-LD 1.1 Framingw3.org
- Data model - Schema.orgschema.org
- Intro to How Structured Data Markup Worksdevelopers.google.com
- General Structured Data Guidelinesdevelopers.google.com