请查看 勘误,了解自发布以来报告的任何错误或 问题。
另请参阅 翻译。
本文档也提供以下非规范格式: EPUB
Copyright © 2010-2020 W3C® (MIT, ERCIM, Keio, Beihang). W3C liability, trademark and permissive document license rules apply.
JSON-LD 框架化允许开发者按示例查询,并 强制为 JSON-LD 文档采用特定的树布局。
本规范描述了 JSON-LD 框架化 1.0 [JSON-LD10-FRAMING] 中定义功能的超集,并且除非另有说明, 本规范中描述的算法与使用先前社区标准创建的 文档完全兼容。
本节描述本文档在发布时的状态。其他文档可能会取代 本文档。当前 W3C 出版物列表以及本技术报告的 最新修订版可在 W3C 技术报告 索引中找到,网址为 https://www.w3.org/TR/。
本文档由 JSON-LD 工作组开发,并派生自 JSON-LD 社区组的最终报告。
有一个 实时 JSON-LD 演练场,能够 演示本文档中描述的功能。
本文档由 JSON-LD 工作组 作为 推荐标准发布。
首选使用 GitHub Issues 讨论本规范。 或者,你可以向我们的邮件列表发送评论。 请将评论发送至 public-json-ld-wg@w3.org (归档)。
请参阅工作组的 实现报告。
本文档已由 W3C 成员、软件开发者以及其他 W3C 组和相关方审查,并由总监认可为 W3C 推荐标准。它是一份稳定文档,可用作 参考资料或被其他文档引用。W3C 制定 推荐标准的作用是引起人们对规范的关注,并促进其 广泛部署。这增强了 Web 的功能和互操作性。
本文档由一个根据 W3C 专利政策运作的组制作。 W3C 维护一份 与该组交付成果相关的任何专利 披露的公开列表; 该页面还包括披露专利的说明。任何实际知晓某项专利, 并认为该专利包含 必要权利要求 的个人,必须按照 W3C 专利政策第 6 节披露相关信息。
本文档受 2019 年 3 月 1 日 W3C 流程文档约束。
本文档是 JSON-LD 工作组生成的三份 JSON-LD 1.1 推荐标准之一:
本节为非规范性内容。
JSON-LD 是一种轻量级语法,用于在 JSON [RFC8259] 中序列化关联数据 [LINKED-DATA]。 它的设计允许以最少的改动将现有 JSON 解释为关联数据。 与其他描述有向图的关联数据表示形式一样, 单个有向图可以有许多不同的序列化形式,每一种都表达 完全相同的信息。开发者通常使用树结构,即表示为 JSON 对象。虽然可以将 图映射到 树,但最终结果的布局必须预先指定。 开发者可以在 JSON-LD 文档上使用框架,为图 指定确定性的布局。
使用分隔符包围一块数据称为“框架化”。
JSON-LD 使用 JSON 分隔符,例如 { 和 },
来分隔关于特定主体的陈述。JSON-LD 还允许主体
通过使用其标识符来引用其他主体,这些标识符表示为
字符串。
然而,由于 JSON-LD 表示一个或多个信息图, 因此把关于若干相关 主体的陈述框架化为一个完整文档的方式不止一种。实际上,信息图可以 被看作一长串彼此独立的陈述(亦称三元组),它们并未以任何方式 捆绑在一起。
JSON-LD 框架化 API
使开发者能够准确指定他们希望数据如何被框架化,
从而将关于特定主体的陈述捆绑在一起,
通过 { 和 } 分隔,并使与其
相关的主体“嵌套”到符合其应用程序预期的特定树结构中。
本节为非规范性内容。
本文档是关于在 JSON 中序列化关联 数据的详细规范。本文档主要面向以下读者:
配套文档 JSON-LD 1.1 规范 [JSON-LD11] 规定了 JSON-LD 文档的语法。
要理解本规范中的基础内容,必须先熟悉 JSON,它在 [RFC8259] 中有详细说明。 还必须理解 JSON-LD 1.1 语法规范 [JSON-LD11], 它是本文档中所有算法所使用的基础语法, 以及 JSON-LD 1.1 API [JSON-LD11-API]。 要理解 API 及其在编程环境中的预期运行方式, 具备 JavaScript 编程语言 [ECMASCRIPT] 和 WebIDL [WEBIDL] 的实际知识会很有帮助。 要理解 JSON-LD 如何映射到 RDF,熟悉 基本 RDF 概念 [RDF11-CONCEPTS] 会很有帮助。
本文档可以突出显示自 JSON-LD 1.0 版本以来的变更。 选择以 变更。
本节为非规范性内容。
可以通过多种方式参与 本规范的开发:
本节为非规范性内容。
本规范使用以下排版约定:
markup标记定义引用 标记外部定义引用注以浅绿色框显示,左边框为绿色,并带有绿色的“注”标题。 注始终是资料性的。
示例以浅卡其色框显示,左边框为卡其色, 并带有卡其色的编号“示例”标题。 示例始终是资料性的。示例内容使用等宽字体,并且可能带有语法着色。 示例可以带有标签式导航按钮, 用于显示将示例转换为其他表示形式后的结果。
本文档使用外部规范中定义的以下术语, 并定义 JSON-LD 专用术语。
从 ECMAScript 语言 规范 [ECMASCRIPT]、 JavaScript 对象表示法(JSON)数据 交换格式 [RFC8259]、 Infra 标准 [INFRA] 和 Web IDL [WEBIDL] 导入的术语
true 和 false。@context 中,如果某个映射条目的值,
或该值的 @id 为 null,
则显式解除术语与 IRI 的关联。
在 JSON-LD 文档主体中,
值为 null 的映射条目
与该映射条目未定义具有相同含义。
如果在展开形式中将 @value、@list 或 @set 设置为 null,
则整个 JSON
对象会被忽略。true 或 false。
从 国际化 资源标识符(IRI) [RFC3987] 导入的术语
@type 的值,
以及定义为词汇表相对的术语的值
都相对于词汇表映射解析,
而不是相对于基准
IRI解析。
从 RDF 1.1 概念和 抽象语法 [RDF11-CONCEPTS]、RDF Schema 1.1 [RDF-SCHEMA] 和 关联数据设计 问题 [LINKED-DATA] 导入的术语
_: 前缀开头的标识符。
_: 开头。
rdf:langString,则可选包含一个语言标签。
@direction 键来设置,
其值必须是字符串 "ltr"、"rtl" 或
null 之一。
有关规范性描述,参见 JSON-LD 1.1 的上下文
定义章节。
@default 键的映射。
true 或 false、
类型化
值,
或带语言标签的
字符串。
它表示一个 RDF
字面量。
@id 键的节点的节点
对象。@version
条目定义不同版本,
发布者可以确保符合 JSON-LD 1.0
[JSON-LD10]
的处理器不会意外处理 JSON-LD 1.1 文档,从而可能产生不同的输出。
API 提供了一个选项,用于将处理模式设置为
json-ld-1.0,
这将阻止 JSON-LD 1.1 功能被激活,
或者在上下文中的
@version
条目显式设置为
1.1 时产生错误。
本规范通过 json-ld-1.1 处理模式
扩展 JSON-LD
1.0。
@context 条目的展开术语
定义的一部分。其形式与嵌入式上下文相同。
当术语用作类型时,它定义一个类型作用域
上下文;
当用作属性时,它定义一个属性作用域
上下文。
@value 条目。
有关规范性描述,参见 JSON-LD 1.1 的值对象章节。
@vocab 键设置的,
其值必须是一个IRI、一个紧凑
IRI、一个术语或
null。
有关规范性描述,参见 JSON-LD 1.1 的上下文
定义章节。
以下术语用于特定算法中。
true,
reverse 标志默认为 false。
@graph 条目中,
或仅在需要表示多个节点对象时才如此。本规范向 JSON-LD 1.1 语法规范 [JSON-LD11] 中定义的 关键字添加若干 关键字(框架化关键字):
@default@embed@embed 的有效值如下:
@always@once@embed,也未指定对象嵌入标志,
则这是默认值。
@never@embed 的任何其他值都是无效的,并表示检测到
invalid @embed value
错误,处理将中止。
@explicit@nullnull
值时使用;否则该值会在
压缩时被移除。
@omitDefault@requireAll所有 JSON-LD 记号和关键字都区分大小写。
本节为非规范性内容。
JSON-LD 1.1 引入了与
JSON-LD 1.0
[JSON-LD10]
兼容的新功能,
但如果由 JSON-LD 1.0 处理器处理,可能会产生不同结果。
处理器默认使用 json-ld-1.1,除非
processingMode API
选项
被显式设置为 json-ld-1.0。
鼓励发布者在上下文中使用
设置为 1.1 的 @version 映射条目,
以确保 JSON-LD 1.0 处理器不会误解 JSON-LD 1.1 功能。
本节为非规范性内容。
框架化用于塑造 JSON-LD 文档中的数据, 它使用一个示例框架文档,该文档既用于匹配 扁平化 数据,也用于展示生成的数据应如何成形的示例。 匹配通过使用属性来执行,这些属性存在于框架中, 用于查找数据中共享公共值的对象。匹配可以 使用框架中存在的全部属性,也可以使用框架中的任意属性。 通过使用匹配的属性值将对象串联起来,对象可以彼此 嵌入。
例如,假设有以下 JSON-LD 框架:
{
"@context": {"@vocab": "http://example.org/"},
"@type": "Library",
"contains": {
"@type": "Book",
"contains": {
"@type": "Chapter"
}
}
}
此框架文档描述了一种 嵌入结构,它会将类型为 Library 的 对象置于顶部,将使用 contains 属性链接到图书馆对象的 Book 类型对象作为属性值嵌入。它还会 将 Chapter 类型对象放入引用它的 Book 对象中, 作为该 Book 对象的嵌入值。
当使用一组与框架组件匹配的扁平化对象时:
{
"@context": {
"@vocab": "http://example.org/",
"contains": {"@type": "@id"}
},
"@graph": [{
"@id": "http://example.org/library",
"@type": "Library",
"location": "Athens",
"contains": "http://example.org/library/the-republic"
}, {
"@id": "http://example.org/library/the-republic",
"@type": "Book",
"creator": "Plato",
"title": "The Republic",
"contains": "http://example.org/library/the-republic#introduction"
}, {
"@id": "http://example.org/library/the-republic#introduction",
"@type": "Chapter",
"description": "An introductory chapter on The Republic.",
"title": "The Introduction"
}]
}
框架算法可以创建一个符合该框架结构的新文档:
如果处理
模式不是 json-ld-1.0,或者省略图标志为 true,
则可以省略顶层 @graph 条目。
{
"@context": {"@vocab": "http://example.org/"},
"@id": "http://example.org/library",
"@type": "Library",
"location": "Athens",
"contains": {
"@id": "http://example.org/library/the-republic",
"@type": "Book",
"creator": "Plato",
"title": "The Republic",
"contains": {
"@id": "http://example.org/library/the-republic#introduction",
"@type": "Chapter",
"description": "An introductory chapter on The Republic.",
"title": "The Introduction"
}
}
}
框架化算法通过以下方式完成此操作:
首先展开输入框架和文档。然后创建一个
扁平化主体映射。
框架中最外层的节点对象
用于匹配映射中的对象,在本例中是查找节点对象,
这些节点对象具有 @type 为 Library,并且具有
contains 属性,其值使用另一个
框架来匹配该属性的值。输入文档恰好包含
一个这样的节点
对象。contains 的值也有
一个节点对象,随后
它被当作框架来匹配作为 Library 对象的
contains 值的主体集合,依此类推。
本节为非规范性内容。
除了按类型匹配之外,框架还可以按 一个或多个属性进行匹配。
例如,以下框架基于属性
值而不是 @type 来选择对象。
{
"@context": {"@vocab": "http://example.org/"},
"location": "Athens",
"contains": {
"title": "The Republic",
"contains": {
"title": "The Introduction"
}
}
}
这将生成与按 @type 选择时相同的框架化结果,
因为这些属性值对每个节点对象都是唯一的。
参见 § 2.3.5 要求全部标志, 以了解如何将匹配限制为匹配包含 全部列出属性或任意此类列出属性的节点对象。
本节为非规范性内容。
空映射
({})被用作通配符,如果属性存在于目标节点对象中,它就会匹配该属性,
而不依赖任何特定值。
例如,以下框架基于属性
通配符而不是 @type 来选择对象。
{
"@context": {"@vocab": "http://example.org/"},
"location": {},
"contains": {
"creator": {},
"contains": {
"description": {}
}
}
}
这将生成与按 @type 选择时相同的框架化结果,
因为匹配的属性对每个节点对象都是不同的。
本节为非规范性内容。
空数组
([])用于不匹配任何值,它只会在目标节点对象中不存在某个属性时
匹配该节点对象。
例如,以下框架基于属性缺失
而不是 @type 来选择对象。
{
"@context": {"@vocab": "http://example.org/"},
"creator": [],
"title": [],
"contains": {
"location": [],
"description": [],
"contains": {
"location": []
}
}
}
这将生成与按 @type 选择时相同的框架化结果,
被排除的属性唯一标识每个节点对象。
请注意,对于那些被显式排除的属性,还会添加值为
null 的附加属性。
本节为非规范性内容。
框架可以基于特定属性值的存在来匹配。
这些值自身可以使用通配符,以匹配特定值
或一组值、语言标签、类型或基准方向。
作为示例,我们将使用图书馆示例的一个多语言版本, 其中包含更复杂的值表示。
{
"@context": {
"@vocab": "http://example.org/",
"contains": {"@type": "@id"}
},
"@graph": [{
"@id": "http://example.org/library",
"@type": "Library",
"location": [
{"@value": "Athens", "@language": "en"},
{"@value": "Αθήνα", "@language": "grc"},
{"@value": "Athína", "@language": "el-Latn"}
],
"contains": "http://example.org/library/the-republic"
}, {
"@id": "http://example.org/library/the-republic",
"@type": "Book",
"creator": [
{"@value": "Plato", "@language": "en"},
{"@value": "Πλάτων", "@language": "grc"},
{"@value": "Plátōn", "@language": "el-Latn"}
],
"title": [
{"@value": "The Republic", "@language": "en"},
{"@value": "Πολιτεία", "@language": "grc"},
{"@value": "Res Publica", "@language": "el-Latn"}
],
"contains": "http://example.org/library/the-republic#introduction"
}, {
"@id": "http://example.org/library/the-republic#introduction",
"@type": "Chapter",
"description": "An introductory chapter on The Republic.",
"title": "The Introduction"
}]
}
通过按值的某个属性匹配,我们可以匹配
具有该属性的框架,并将结果限制为
匹配的属性值。在本例中,我们将只按拉丁化希腊语
(el-Latn)中的值来框架化 Library 和 Book 对象:
{
"@context": {"@vocab": "http://example.org/"},
"location": {"@value": {}, "@language": "el-Latn"},
"contains": {
"creator": {"@value": {}, "@language": "el-Latn"},
"title": {"@value": {}, "@language": "el-Latn"},
"contains": {
"title": "The Introduction"
}
}
}
这会生成以下框架化结果:
@id 匹配本节为非规范性内容。
如果框架匹配某个特定
标识符(@id),则可以匹配该框架。这可以用原始的
扁平化图书馆对象
输入来说明,并使用一个按特定 @id 值匹配的框架:
{
"@context": {"@vocab": "http://example.org/"},
"@id": "http://example.org/library",
"contains": {
"@id": "http://example.org/library/the-republic",
"contains": {
"@id": "http://example.org/library/the-republic#introduction"
}
}
}
这会生成以下框架化结果:
框架也可以从一组标识符中匹配。
在框架内,@id 具有数组值是可以接受的,
其中各个值会被视为 IRI。
{
"@context": {"@vocab": "http://example.org/"},
"@id": ["http://example.org/home", "http://example.org/library"],
"contains": {
"@id": ["http://example.org/library/the-republic"],
"contains": {
"@id": ["http://example.org/library/the-republic#introduction"]
}
}
}
这会生成以下框架化结果:
本节为非规范性内容。
空框架会匹配任何节点对象,即使这些 对象嵌入在别处,也会导致它们在顶层被序列化。
{
"@context": {"@vocab": "http://example.org/"}
}
这会生成以下框架化结果:
本节为非规范性内容。
框架可以指定输入文件中不存在的属性。如果
显式包含
标志为 false,框架化算法
将向结果添加属性和值。节点对象或
值对象中的
@default 属性,
或作为 @type 的值,
提供要在生成的
输出文档中使用的默认值。如果没有 @default 值,该属性将以
null 值输出。(参见 § 2.3.3 省略默认值标志
以了解避免这种情况的方法)。
框架中的属性值除此之外不会在输出文档中 使用。它的目的是用于框架匹配和 查找默认值。请注意以下示例中 Library 的 description 值。
{
"@context": {"@vocab": "http://example.org/"},
"@type": "Library",
"description": "A great Library.",
"contains": {
"@type": "Book",
"description": {"@default": "A great book."},
"contains": {
"@type": "Chapter"
}
}
}
默认值也可以用于 @type,与其他属性类似。
在这种情况下,没有 @type 的匹配节点对象将采用
框架中默认
对象的值。
默认
对象具有一个值,该值是单个IRI。
如果指定了多个 IRI,
则只有第一个会用作默认类型。
该框架匹配具有特定属性值的对象,
并为匹配的对象提供 @type 的默认值。
{
"@context": {"@vocab": "http://example.org/"},
"@type": "Library",
"contains": {
"@type": {"@default": "Book"},
"creator": "Plato",
"contains": {
"@type": {"@default": "Chapter"},
"description": "An introductory chapter on The Republic."
}
}
}
缺少特定 @type 值的数据,但会基于
其他属性值进行匹配。
{
"@context": {
"@vocab": "http://example.org/",
"contains": {"@type": "@id"}
},
"@graph": [{
"@id": "http://example.org/library",
"@type": "Library",
"contains": "http://example.org/library/the-republic"
}, {
"@id": "http://example.org/library/the-republic",
"creator": "Plato",
"title": "The Republic",
"contains": "http://example.org/library/the-republic#introduction"
}, {
"@id": "http://example.org/library/the-republic#introduction",
"description": "An introductory chapter on The Republic.",
"title": "The Introduction"
}]
}
本节为非规范性内容。
可以使用API 选项来控制框架化, 或者通过在框架中添加框架化关键字, 如 § 1.5 语法记号和关键字中所述。
使用关键字设置的框架化标志仅对 它们出现的框架,以及为不存在框架对象的对象创建的 隐式框架生效。
本节为非规范性内容。
对象嵌入标志
确定被引用的
节点对象
是作为引用它的
对象的属性值嵌入,还是保留为节点引用。
对象嵌入标志的初始值使用
选项设置。
请考虑以下框架,
它基于对象嵌入标志的默认
embed@once 值:
{
"@context": {"@vocab": "http://example.org/"},
"@type": "Library"
}
因为对象嵌入标志的默认值是
@once
(此外显式包含标志为
false),
未列出的属性会被添加到输出中,并使用默认空框架
隐式嵌入。因此,会生成与上面的
框架化图书馆对象相同的输出,
前提是 标志为 orderedtrue。
但是,如果显式添加 @embed 属性,并将其
值设为 @never,则 Book 和 Chapter 的值将被排除。
{
"@context": {"@vocab": "http://example.org/"},
"@type": "Library",
"contains": {
"@type": "Book",
"@embed": "@never"
}
}
为了说明 @once 不展开值的情况,
请考虑一个替代的图书馆示例,其中书籍被双重索引。
{
"@context": {
"@vocab": "http://example.org/",
"books": {"@type": "@id"},
"contains": {"@type": "@id"}
},
"@graph": [{
"@id": "http://example.org/library",
"@type": "Library",
"books": "http://example.org/library/the-republic",
"contains": "http://example.org/library/the-republic"
}, {
"@id": "http://example.org/library/the-republic",
"@type": "Book",
"creator": "Plato",
"title": "The Republic",
"contains": "http://example.org/library/the-republic#introduction"
}, {
"@id": "http://example.org/library/the-republic#introduction",
"@type": "Chapter",
"description": "An introductory chapter on The Republic.",
"title": "The Introduction"
}]
}
当使用具有默认 @embed 值 @once 的同一框架进行框架化时,
如果 标志为 orderedtrue,
则只有 "books" 属性会有内容,
而 "contains" 属性会使用引用。
如果我们使用带有 "@embed": "@always" 的框架,
则两个属性都将包含展开的值。
{
"@context": {"@vocab": "http://example.org/"},
"@type": "Library",
"@embed": "@always"
}
本节为非规范性内容。
显式
包含标志用于确定
哪些属性将包含在输出文档中。
默认值为 false,这意味着输入节点对象中存在但不在
关联框架中的属性将被
包含在输出对象中。
如果为 true,则只有输入框架中存在的
属性会被放入输出。
显式包含标志的初始值使用
选项设置。
explicit
例如,取一个扩展版的图书馆框架,其中包含 输入中的一些属性,但省略其他属性。
{
"@context": {"@vocab": "http://example.org/"},
"@type": "Library",
"description": {},
"contains": {
"@type": "Book",
"@explicit": true,
"title": {},
"contains": {
"@type": "Chapter"
}
}
}
生成的输出将排除 Book 中未在框架对象中 显式列出的属性:
请注意,Library 对象包含一个 null
description 属性,因为它在框架中使用
"description": {} 被显式请求。creator 属性
不存在于输出中,因为它不是显式的。
本节为非规范性内容。
省略默认值标志
改变了当框架中描述的属性
不存在于输入文档中时,框架化生成输出的方式。
省略默认值标志的初始值使用
选项设置。
进一步讨论见 § 2.2
默认内容。
omitDefault
请考虑以下输入文档:
{
"@context": {
"@vocab": "http://example.org/",
"child": {"@type": "@id"}
},
"@graph": [{
"@id": "http://example.org#John",
"@type": "Person",
"name": "John",
"child": "http://example.org#Jane"
}, {
"@id": "http://example.org#Jane",
"@type": "Person",
"name": "Jane"
}]
}
为了说明省略默认值标志的有用之处,请考虑以下
不使用 @omitDefault 的框架:
{
"@context": {
"@vocab": "http://example.org/",
"child": {"@type": "@id"}
},
"@type": "Person",
"child": {
"@embed": "@always"
}
}
生成的输出将包含一个值为
null 的 "child" 属性,这可能并不总是期望的:
请注意,由于在框架中 child 属性下指定了
"@embed": "@always" 选项,
因此对于不具有该属性的匹配项,输出中会出现
"child": null,这可能是不希望的。
为了阻止这种默认 null 输出出现,
可以像这样将 @omitDefault 设置为 true:
{
"@context": {
"@vocab": "http://example.org/",
"child": {"@type": "@id"}
},
"@type": "Person",
"child": {
"@embed": "@always",
"@omitDefault": true
}
}
这会产生以下(期望的)输出:
本节为非规范性内容。
省略图标志
确定包含单个
节点对象的框架化输出
是否包含在 @graph 中。
省略图标志的初始值使用
选项设置,或者基于
处理
模式;如果处理模式为
omitGraphjson-ld-1.0,则输出
始终包含一个 @graph 条目;否则,@graph 条目仅用于
描述多个节点对象,这与
压缩保持一致。
进一步讨论见 § 4.1
框架化算法。
结果与原始的扁平化图书馆
对象示例相同,
但顶层有一个 @graph。
示例 5 显示了
省略图标志
设置为 true 时的结果,这是当
处理
模式设置为默认 json-ld-1.1 时的默认值。
通过将处理
模式设置为 json-ld-1.0,
或将省略图
标志设置为 false,可以将顶层对象包裹在 @graph 中。
本节为非规范性内容。
要求全部标志
用于框架匹配中,以确定输入文档中的
节点对象何时
匹配某个框架。匹配时,
对象可以包含 @type 和其他
属性;如果要求
全部标志的值为 false(默认值),
则当对象中的任意属性值匹配
框架对象中的
节点模式时即构成匹配。
如果该标志值为 true,则框架
对象中的所有
属性都必须存在于节点
对象中,节点才会匹配。
以下框架按多个属性匹配,包括某个属性的缺失。
使用扁平化图书馆对象示例,
我们可以匹配同时包含 title 和 description 或 title 和 creator
属性的对象。
如果我们使用设置为 false 的 @requireAll,则可以按
任意属性的存在进行匹配,而不是所有属性都必须存在。
{
"@context": {"@vocab": "http://example.org/"},
"@type": "Library",
"contains": {
"@requireAll": true,
"creator": {},
"title": {},
"contains": {
"@requireAll": true,
"description": {},
"title": {}
}
}
}
这将再次生成所需的框架化输出:
本节为非规范性内容。
框架可以包含 @reverse,或者包含使用 @reverse
定义的术语的值,
用于反转输出对象中的关系。例如,
可以使用以下框架反转图书馆示例:
{
"@context": {
"@vocab": "http://example.org/",
"within": {"@reverse": "contains"}
},
"@type": "Chapter",
"within": {
"@type": "Book",
"within": {
"@type": "Library"
}
}
}
使用上面的扁平化图书馆示例,会得到以下结果:
本节为非规范性内容。
框架可以包含 @graph,这允许将
命名图中的信息
暴露在其适当的
图上下文内,这些命名图包含于 JSON-LD 文档中。
默认情况下,框架化使用一个合并图,该图由输入中所有图内的
所有节点对象
组成。通过在框架中使用 @graph,
输出文档可以包含专门来自输入文档中所含
命名
图的信息。
以下示例使用图书馆主题的一个变体,其中信息
分散在默认图和名为
http://example.org/graphs/books 的图之间:
{
"@context": {"@vocab": "http://example.org/"},
"@type": "Library",
"contains": {
"@id": "http://example.org/graphs/books",
"@graph": {
"@type": "Book"
}
}
}
[{
"@context": {"@vocab": "http://example.org/"},
"@id": "http://example.org/graphs/books",
"@graph": [{
"@id": "http://example.org/library/the-republic",
"@type": "http://example.org/Book",
"http://example.org/contains": {
"@id": "http://example.org/library/the-republic#introduction"
},
"http://example.org/creator": "Plato",
"http://example.org/title": "The Republic"
}, {
"@id": "http://example.org/library/the-republic#introduction",
"@type": "http://example.org/Chapter",
"http://example.org/description": "An introductory chapter on The Republic.",
"http://example.org/title": "The Introduction"
}]
}, {
"@context": {"@vocab": "http://example.org/"},
"@id": "http://example.org/library",
"@type": "http://example.org/Library",
"http://example.org/contains": {"@id": "http://example.org/graphs/books"},
"http://example.org/name": "Library"
}]
除了标记为非规范性的章节外,本规范中的所有编写指南、图表、示例和注释均为非规范性内容。 本规范中的其他所有内容均为规范性内容。
本文档中的关键词 MAY、MUST、MUST NOT、SHOULD 和 SHOULD NOT 应按 BCP 14 [RFC2119] [RFC8174] 中所述解释,当且仅当它们像这里所示一样全部大写时。
有一类产品可以声称符合本 规范:JSON-LD 处理器。
符合规范的 JSON-LD 处理器是一个系统, 它能够以与本规范中定义的算法一致的方式执行 框架化操作。
JSON-LD 处理器不得 尝试纠正格式错误的 IRI 或语言标签; 但是,它们可以发出验证警告。除在 相对和绝对 IRI 之间转换外, 不会修改 IRI。
除非使用
processingMode API
选项指定,
否则处理模式
使用本地上下文中的
@version 条目设置,并影响包括展开和压缩在内的算法行为。
一旦设置,尝试更改为不同处理模式就是错误,
处理器必须生成
处理
模式冲突
错误并中止进一步处理。
本规范中的算法通常更关注清晰性 而非效率。因此,JSON-LD 处理器可以 以任何期望的方式实现本规范给出的算法, 只要最终结果与通过规范算法获得的结果 无法区分即可。
在描述对关键字执行操作的算法步骤中,这些步骤 也适用于关键字 别名。
实现者可以通过成功通过 JSON-LD 框架化测试套件 的测试用例,部分检查其对本规范的一致性级别。 但请注意,通过测试 套件中的所有测试并不意味着完全符合本规范。它仅意味着 该实现符合测试套件所测试的方面。
以下章节描述用于框架化 JSON-LD 文档的算法。 框架化是这样一个过程:取得一个表达信息图的 JSON-LD 文档,并应用特定的图布局 (称为框架)。
框架化使用节点映射 生成算法, 将 JSON-LD 文档中定义的每个对象放入扁平化主体映射中,从而允许 框架化算法对其进行操作。
本节中描述的所有算法都旨在操作 语言原生数据结构。也就是说,这些算法均不要求将基于文本的 JSON 文档序列化作为输入或输出。
对 JSON 数据结构的引用会使用其内部表示来解释,以便 描述算法。
有效的 JSON-LD 框架是有效 JSON-LD 文档的超集, 允许附加内容,并且这些内容会在展开过程中保留。 JSON-LD 1.1 语法规范 [JSON-LD11] 中定义的语法 扩展如下:
@default 的值可以包括值
@null,
或者除了键展开为 IRI 的
条目值在语法中允许的其他值以外,
包含仅有 @null 的数组。
处理器必须在展开时保留此值。
默认
对象的所有其他条目必须被忽略。
@id 和 @type 的值也可以是空映射、
IRI 引用、
仅包含空映射的
数组、
或 IRI 引用数组。
@type 的值也可以
是带有 @default 条目的映射,
其值被限制为 IRI。
处理器必须在展开时保留此值。
@graph 条目。
对于主体同时也是命名
图的节点,
如果框架对象
包含 @graph,则会将框架化
扩展到关联命名图中的节点
对象。框架化算法接受
五个必需输入变量和一个可选输入变量。
必需输入包括
框架化状态
(state)、
要框架化的 subjects 列表、
输入框架
(expanded frame)、
用于收集部分框架结果的 parent,
以及 active property。
可选输入变量是 标志。
ordered
该算法向 parent 添加元素:如果它是数组,则将元素追加到
parent;如果它是映射,
则将元素追加到 parent 中与 active property 关联的数组。
请注意,如果 parent 是数组,则 active property必须为 null,
而如果它是映射,
则它不得为 null。
invalid frame
错误并中止处理。
@embed、@explicit 和
@requireAll 的任何属性值覆盖。
ordered 标志为
true,则按 id 的字典序排序:
@id 和
id。
false,
并且在 state 中存在与
graph name 和 id 关联的已嵌入节点,
则不再对此 node 执行额外处理。
true,
且 embed 为 @never,或者嵌入会创建循环引用,
则将 output 添加到 parent,
并不再对此 node 执行额外处理。true,
embed 为 @once,
并且在 state 中存在与
graph name 和 id 关联的已嵌入节点,
则将 output 添加到 parent,
并不再对此 node 执行额外处理。
@included 条目,
则调用该算法,
使用 state 的副本,其中嵌入标志的值设置为
false,
subjects、frame、
output 作为 parent,并将 @included 作为
active property。
ordered
标志为 true,则按 property 的字典序排序:
true,
处理器
不得向
output 添加 property 的任何值,并跳过以下
步骤。
@list 属性的映射,则按顺序处理列表中的每个
listitem,并添加到输出中的新列表映射:
true,
将 listitem 中 @id 的值
作为新 subjects 数组中的唯一项,
将 frame 中 @list 的第一个值作为
frame,
list 作为 parent,并将 @list 作为
active property。
如果 frame 不存在,则使用新的映射
创建新的
frame,其中 @embed、@explicit
和 @requireAll 的属性
取自 embed、explicit 和
requireAll。
@list。
true,
将 item 中 @id 的值
作为新 subjects 数组中的唯一项,
将 frame 中 property 的第一个值作为
frame,
output 作为 parent,并将 property 作为
active property。
如果 frame 不存在,则使用
新的映射
创建新的 frame,
其中 @embed、@explicit 和
@requireAll 的属性
取自 embed、explicit 和
requireAll。
true 的 @omitDefault,
或者不包含 @omitDefault 且 state 中
省略默认值标志的值为
true,
则跳过 property 和 property frame。
@preserve 属性,其值是
frame 中 @default 的值的副本(如果存在),
否则为字符串 @null。
@reverse,则
对于 frame 中 @reverse 值中的每个
reverse property 和 sub frame:
框架匹配算法作为框架化算法的一部分使用,
用于确定特定节点对象是否匹配
框架中设置的条件。
一般来说,如果节点对象满足 @type、
@id 上的匹配,
或者匹配若干不同属性之一,则该节点对象匹配框架。
如果要求全部标志为
true,则所有属性都必须具有默认值
或匹配,框架才匹配。
由于匹配是在展开后的节点对象上执行的,因此所有值都将采用 数组形式。
节点匹配使用 JSON 构造的组合来匹配任意、零个或 某些特定值:
[](不匹配任何值)[框架对象]
(节点模式)[IRI+]
@type 和 @id 匹配,
允许匹配所列 IRI 中的任意一个。
[值对象]
(值模式)@value、@type 和 @language 的值
也可以是一个或多个字符串值组成的数组,
@language 的值在比较时不区分大小写。。
{}
(通配符)
框架匹配算法接受框架化状态(state)、 来自扁平化主体映射的待匹配主体列表(subjects)、 要匹配的框架 (frame)以及 requireAll 标志, 并通过按如下方式过滤 subjects 中的每个 node 返回匹配主体列表:
匹配框架时会考虑所有属性,包括 @id 和 @type,
但不考虑其他关键字。
@id:
@type:
@id 或 @type 且不匹配,
则 node 不匹配,并终止处理。
@default 条目的映射,
并且 node 中任何其他属性具有非默认匹配,则 property 匹配。
不匹配任何值,
则 node 不匹配,并中止进一步匹配。
通配符,
则 property 匹配。
值模式(value pattern):
属性匹配使用值匹配算法确定。 值模式匹配算法作为框架化
和框架匹配算法的一部分使用。值对象
使用
和
不匹配任何值
模式,在 通配符@value、@type 和
@language 上匹配值模式,同时还允许特定值与使用
数组形式为每个值
对象属性定义的一组值匹配。
该算法接受值模式(pattern)和值对象(value)作为
参数。
Value 使用以下算法匹配 pattern:
@value、@type 和 @language 的值,如果不存在则为
null,
其中 @language 的值会规范化为小写。。
@value、@type 和 @language 的值,如果不存在则为
null,
其中 @language 的字符串值会规范化为
小写。。
通配符
时,或满足以下条件时,Value 匹配 pattern:
此 API 提供一种简洁机制,使开发者能够将 JSON-LD 数据转换为各种在不同编程语言中更易处理的输出格式。 如果在某个编程环境中提供 JSON-LD API,则以下 API 的全部内容必须实现。
JSON-LD API 使用 Promises 来表示 各种延迟操作的结果。 Promises 定义于 [ECMASCRIPT]。 规范中的一般用法可参见 [promises-guide]。 实现可以选择以适合其原生环境的方式实现, 只要它们通常使用相同的方法、参数和选项, 并返回相同结果即可。
接口标记为 [Exposed=JsonLd],
这会创建一个全局接口。
JSON-LD 中使用 WebIDL 虽然适合在浏览器中使用,
但并不限于这种用途。
JSON-LD 处理器接口 是开发者用于访问 JSON-LD 转换方法的 高层编程结构。下面的定义是对 JSON-LD 1.1 API [JSON-LD11-API] 中定义接口的实验性 扩展。
需要强调的是,实现不会修改输入参数。
如果检测到错误,Promise 会以带有适当
的 codeJsonLdFramingError 被拒绝,
并停止处理。
WebIDL/* * The JsonLd interface is created to expose the JsonLdProcessor interface. */ [Global=JsonLd, Exposed=JsonLd] interfaceJsonLd{}; [Exposed=JsonLd] interfaceJsonLdProcessor{constructor(); static Promise<JsonLdRecord>frame(JsonLdInputinput,JsonLdInputframe, optionalJsonLdOptionsoptions = {}); };
JsonLdProcessor 接口的
frame()
方法会按照框架化
算法中的步骤,
使用frame
对给定的 input 进行框架化:
Promise promise
并返回它。随后异步执行以下步骤。ordered 设置为 false。
true,
并将ordered 设置为 false。
@context 的值(如果存在),否则设置为
新的空上下文。
documentUrl
(如果可用),否则设置为base 选项,
该选项来自options。
null。
@graph,则将 frameDefault
选项设置到options 中,其值为
true。
embed,
默认值为 @once。
false
explicit,
默认值为 false。
requireAll,
默认值为 false。
omitDefault,
默认值为 false。
frameDefault 为
true,则为 @default,
否则为 false。
@merged,
则在 graph map 中为 @merged 添加一个条目,
其值设置为
传入 graph map 执行
合并节点映射
算法的结果。
null 作为 active property。
json-ld-1.0,
则移除 results 中每个节点对象的 @id
条目,其中该条目值是空白节点标识符,
且在 results 内任何属性值中仅出现一次。
@preserve 的所有
条目
替换为该条目的第一个值。
@preserve 的映射替换为该值。
compact
方法的结果,使用
active context、
inverse context、
null 作为 active property、
results 作为 element、,
以及来自options的
compactArrays
和 ordered
标志。
@null 值替换为
null。
如果替换后某个数组仅包含值
null,
则移除该值,留下
空数组。
omitGraph 为 false
且
compacted results 没有顶层 @graph 条目,或者其值
不是数组,则修改
compacted results,将 compacted results 的非 @context
条目
放入一个包含于 @graph 的数组值中的映射内。
如果 omitGraph 为 true,顶层
@graph 条目仅用于包含多个节点对象。
input 数据的框架;其形式可以是映射,
也可以是 IRI。JsonLdOptions 类型定义默认选项
值。
WebIDLtypedef record<USVString, any> JsonLdRecord;
JsonLdRecord 是用于包含任意映射条目的映射定义,
这些条目是解析 JSON 对象的结果。
WebIDLtypedef (JsonLdRecordor sequence<JsonLdRecord> or USVString or RemoteDocument)JsonLdInput;
JsonLdInput 接口用于指代
一个输入值,
该值可以是 JsonLdRecord、
JsonLdRecords 的
sequence、
表示 IRI 的字符串,
该 IRI 可以被解引用以获取有效 JSON 文档,
或已解引用的 RemoteDocument。
当该值是 JsonLdRecord 或 JsonLdRecords 的 sequence 时,
这些值会被视为其等价的内部表示值,
其中 JsonLdRecord
等价于映射,
而 JsonLdRecords
的 sequence 等价于由映射
组成的数组。
映射条目会被转换为
[INFRA] 中的等价项。
JsonLdFramingError 类型用于
报告处理错误。
WebIDLdictionaryJsonLdFramingError{JsonLdFramingErrorCodecode; USVString?message= null; }; enumJsonLdFramingErrorCode{ "invalid frame", "invalid @embed value" };
JSON-LD 框架化扩展了 JSON-LD 1.1 处理算法和 API JSON-LD 1.1 API [JSON-LD11-API] 中定义的错误接口和错误码。
codemessageJsonLdFramingErrorCode
表示有效 JSON-LD 框架化错误码的集合。
invalid @embed value@embed 的值不是对象嵌入标志可识别的值之一。
invalid frame本节描述 JSON-LD API 中使用的数据类型定义。
JsonLdContext 类型用于 指代一个值, 该值可以是映射、表示 IRI 的 字符串, 或由映射 和字符串组成的数组。
参见 JSON-LD 1.1 API [JSON-LD11-API] 中的 JsonLdContext 定义。
JsonLdOptions 类型用于向
JsonLdProcessor 方法传递
各种选项。
WebIDLdictionaryJsonLdOptions{ (JsonLdEmbedor boolean)embed= "@once"; booleanexplicit= false; booleanomitDefault= false; booleanomitGraph; booleanrequireAll= false; booleanframeDefault= false; booleanordered= false; }; enumJsonLdEmbed{ "@always", "@once", "@never" };
除了 JSON-LD 1.1 API [JSON-LD11-API] 中定义的选项外, 框架化还定义这些 附加选项:
embedtrue 将该标志设置为
@once,而值 false 将该标志
设置为 @never。
explicitframeDefaultomitDefaultomitGraphjson-ld-1.0 时设置为 false,否则设置为 true。
orderedtrue,则所指示的某些算法
处理步骤会按字典序排序。
如果为 false,处理时不考虑
顺序。requireAllJsonLdEmbed 枚举
选项的值:
embed
@always@never@once
@embed,也未指定对象嵌入标志,
则这是默认值。
参见 JSON-LD 1.1 API [JSON-LD11-API] 中的 JsonLdOptions 定义。
参见 § A. IANA 考量中的 安全考量。
本节仅用于标准社区审查;如果本规范 成为 W3C 推荐标准, 将提交给互联网工程指导组。
JSON-LD 框架使用 [JSON-LD11]
中描述的同一 MIME 媒体类型,
并带有必需的 profile 参数。
profile标识该资源为 JSON-LD 框架的单个 URI。 当在不了解 profile 的情况下处理时,profile 不会改变资源表示的语义, 因此了解和不了解带 profile 资源的客户端都可以安全地使用同一 表示。
http://www.w3.org/ns/json-ld#framed在提供和请求 JSON-LD 框架文档时,应该使用
http://www.w3.org/ns/json-ld#framed。
由于 JSON-LD 旨在作为有向图的纯数据交换格式,
因此该序列化不应该通过
JavaScript 的 eval()
函数等代码执行机制来解析。(无效)文档可能包含代码,
执行后可能导致意外副作用,从而危及
系统安全。
处理 JSON-LD 文档时,通常会自动跟随指向远程上下文的链接, 从而在没有用户对每个文件提出明确请求的情况下传输文件。 如果远程上下文由第三方提供, 这可能允许其收集使用模式或类似信息,从而引发隐私问题。 特定实现,例如 JSON-LD 1.1 处理算法和 API 规范 [JSON-LD11-API] 中定义的 API, 可以提供细粒度机制来控制这种行为。
从 Web 上通过非安全连接(例如 HTTP)加载的 JSON-LD 上下文 存在被攻击者篡改的风险, 从而可能以危及安全的方式修改 JSON-LD 活动上下文。 建议任何出于关键任务目的依赖远程上下文的应用程序 在允许系统使用该远程上下文之前对其进行审查并 缓存。
鉴于 JSON-LD 允许用短术语替代长 IRI, JSON-LD 文档在处理时可能会大幅展开,在最坏情况下, 生成的数据可能耗尽接收者的所有资源。应用程序 应对任何数据保持适当怀疑。
由于 JSON-LD 对可使用的 IRI 方案不设限制, 且词汇表相对 IRI 使用字符串拼接而不是 IRI 解析,因此可能构造出 在解引用时可被恶意使用的 IRI。
与 application/ld+json 一起使用的片段标识符 会按照 RDF 语法处理,如 RDF 1.1 概念和抽象语法 [RDF11-CONCEPTS] 所述。
本节为非规范性内容。
WebIDL/* * The JsonLd interface is created to expose the JsonLdProcessor interface. */ [Global=JsonLd, Exposed=JsonLd] interfaceJsonLd{}; [Exposed=JsonLd] interfaceJsonLdProcessor{constructor(); static Promise<JsonLdRecord>frame(JsonLdInputinput,JsonLdInputframe, optionalJsonLdOptionsoptions = {}); }; typedef record<USVString, any>JsonLdRecord; typedef (JsonLdRecordor sequence<JsonLdRecord> or USVString or RemoteDocument)JsonLdInput; dictionaryJsonLdFramingError{JsonLdFramingErrorCodecode; USVString?message= null; }; enumJsonLdFramingErrorCode{ "invalid frame", "invalid @embed value" }; dictionaryJsonLdOptions{ (JsonLdEmbedor boolean)embed= "@once"; booleanexplicit= false; booleanomitDefault= false; booleanomitGraph; booleanrequireAll= false; booleanframeDefault= false; booleanordered= false; }; enumJsonLdEmbed{ "@always", "@once", "@never" };
本节为非规范性内容。
以下是在发布时仍然开放的问题列表。
允许类作用域框架化。
同一框架文档中有多个框架?
重新框架化关系。
本节为非规范性内容。
@embed)可以采用不同
值,以便更好地控制对象嵌入。通配符
和
不匹配任何值
可用于类型和属性值。
@value、@type 和 @language 的值
可以使用
通配符
和
不匹配任何值,
也可以使用一组特定字符串进行匹配(例如一组特定
语言)。
@reverse。@id 使用一个或多个值,以允许在框架中匹配
特定对象。json-ld-1.0,
仅用于该 @id 的带有空白节点标识符的
@id 条目
会被移除。
@link 和内存中对象链接的支持。omitDefault API 选项和/或
当前处理模式控制。
ordered
选项,默认值为 false。该选项用于算法中
控制映射
条目键的迭代。此前,
算法总是要求这种顺序。用于
评估测试结果的说明也已相应更新。@reverse 或使用
@reverse 定义的术语包含反向属性,这可能会导致引用
框架所定位节点的节点创建反向引用。
本节为非规范性内容。
ordered
选项,默认值为 false。该选项用于算法中
控制映射
条目键的迭代。此前,
算法总是要求这种顺序。用于
评估测试结果的说明也已相应更新。application/ld-frame+json 变更为
带有必需 profile 参数的 application/ld+json。
@id 和 @type。
@first 和 @last 值,改用
@once。
json-ld-1.1,除非显式设置为
json-ld-1.0。
@type 可以具有默认值,该默认值不用于
框架匹配目的。本节为非规范性内容。
JsonLdProcessor 处理步骤。本节为非规范性内容。
[Exposed=(Window,Worker)] 改为 [Exposed=JsonLd],
后者声明为全局接口,以便为非浏览器用途暴露 JsonLdProcessor 接口,
从而处理审查建议。本节为非规范性内容。
编辑们特别感谢以下个人对本规范的编写和编辑作出 重要贡献:
此外,以下人员在发布时是工作组成员:
还要非常感谢 JSON-LD 社区 组的参与者,他们在邮件列表和 每周电话会议中处理了许多技术问题:Chris Webber、David Wood、Drummond Reed、Eleanor Joslin、Fabien Gandon、Herm Fisher、Jamie Pitts、Kim Hamilton Duffy、Niklas Lindström、Paolo Ciccarese、Paul Frazze、Paul Warren、Reto Gmür、Rob Trainer、Ted Thibodeau Jr. 和 Victor Charpenay。