JSON-LD 1.1

基于 JSON 的链接数据序列化

W3C 推荐标准

本版本:
https://www.w3.org/TR/2020/REC-json-ld11-20200716/
最新发布版本:
https://www.w3.org/TR/json-ld11/
最新编辑草稿:
https://w3c.github.io/json-ld-syntax/
测试套件:
https://w3c.github.io/json-ld-api/tests/
实现报告:
https://w3c.github.io/json-ld-api/reports/
上一版本:
https://www.w3.org/TR/2020/PR-json-ld11-20200507/
上一推荐标准:
https://www.w3.org/TR/2014/REC-json-ld-20140116/
编辑者:
Gregg Kellogg (v1.0 and v1.1)
Pierre-Antoine Champin (LIRIS - Université de Lyon) (v1.1)
Dave Longley (Digital Bazaar) (v1.1)
前任编辑者:
Manu Sporny (Digital Bazaar) (v1.0)
Markus Lanthaler (Google) (v1.0)
作者:
Manu Sporny (Digital Bazaar) (v1.0)
Dave Longley (Digital Bazaar) (v1.0 and v1.1)
Gregg Kellogg (v1.0 and v1.1)
Markus Lanthaler (Google) (v1.0)
Pierre-Antoine Champin (LIRIS - Université de Lyon) (v1.1)
Niklas Lindström (v1.0)
参与:
GitHub w3c/json-ld-syntax
提交错误
提交历史
拉取请求

请检查 勘误表 以了解自发布以来报告的任何错误或问题。

另请参阅 翻译

本文档也以非规范格式提供: EPUB


摘要

JSON 是一种有用的数据序列化和消息传递格式。 本规范定义了 JSON-LD 1.1,这是一种基于 JSON 的格式,用于序列化 链接数据。该语法设计为轻松集成到已使用 JSON 的部署系统中,并提供从 JSON 到 JSON-LD 的平滑升级路径。 它主要旨在成为在基于 Web 的编程环境中使用链接数据、构建可互操作的 Web 服务以及在基于 JSON 的存储引擎中存储链接数据的方式。

本规范描述了在 JSON-LD 1.0 [JSON-LD10] 中定义的功能的超集,并且, 除非另有说明, 使用本规范 1.0 版本创建的文档仍与 JSON-LD 1.1 兼容。

本文档的状态

本部分描述了本文档在发布时的状态。其他文档可能取代 本文档。当前 W3C 出版物列表以及 本技术报告的最新修订版可在 W3C 技术报告 索引 中找到,网址为 https://www.w3.org/TR/。

本文档由 JSON-LD 工作组 开发,并源自 JSON-LD 社区组最终报告

有一个 在线 JSON-LD 游乐场,能够演示本文档中描述的功能。

本规范旨在 取代 JSON-LD 1.0 [JSON-LD10] 规范。

本文档由 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 推荐标准之一:

1. 介绍

本节为非规范性内容。

链接数据 [LINKED-DATA] 是在不同文档和网站之间创建基于标准的机器可解释数据网络的一种方式。它允许一个应用从一段链接数据开始,并沿着嵌入的链接追踪到托管在 Web 不同站点上的其他链接数据。

JSON-LD 是一种用于在 JSON [RFC8259] 中序列化链接数据的轻量级语法。其设计允许现有的 JSON 仅作最少更改即可被解释为链接数据。JSON-LD 主要用于在基于 Web 的编程环境中使用链接数据、构建可互操作的 Web 服务,以及在基于 JSON 的存储引擎中存储链接数据。由于 JSON-LD 与 JSON 完全兼容,今天大量可用的 JSON 解析器和库可以被重用。除了 JSON 提供的所有功能之外,JSON-LD 还引入了:

JSON-LD 的设计使其可以直接作为 JSON 使用,而无需了解 RDF [RDF11-CONCEPTS]。它也可以与像 SPARQL 这样的其他链接数据技术一起用作 RDF [SPARQL11-OVERVIEW]。需要上面任一功能或需要以基于 JSON 的语法序列化一个 RDF graphDataset 的开发者会发现 JSON-LD 很有价值。打算将 JSON-LD 与 RDF 工具一起使用的人会发现它可以像 [Turtle] 和 [TriG] 一样用作另一种 RDF 语法。JSON-LD 与 RDF 的完整关系详见第 § 10. Relationship to RDF 节。

该语法的设计旨在不干扰已部署并运行 JSON 的系统,同时提供从 JSON 到 JSON-LD 的平滑升级路径。由于此类数据的形状差异很大,JSON-LD 提供了一些机制,将文档重塑为确定性的结构,从而简化其处理。

1.1 如何阅读本文档

本节为非规范性内容。

本文档是关于在 JSON 中序列化链接数据的详细规范。本文档主要面向以下受众:

配套文档 JSON-LD 1.1 Processing Algorithms and API 规范 [JSON-LD11-API] 描述了如何通过为常见 JSON-LD 操作提供标准库接口,在更高层次上使用 JSON-LD。

要理解本规范的基础内容,你首先必须熟悉 JSON,该内容在 [RFC8259] 中有详细说明。

本文档在讨论超链接时几乎完全使用术语 IRIInternationalized Resource Indicator)。许多 Web 开发者更熟悉 URL(Uniform Resource Locator)一词。本文档也会偶尔使用 URI(Uniform Resource Indicator)术语。虽然这些术语在技术社区中常被互换使用,但它们之间具有重要区别,本规范尽力在各处使用恰当的术语。

本文档可以高亮显示自 JSON-LD 1.0 版本以来的更改。选择以 显示更改。

1.2 贡献

本节为非规范性内容。

参与本规范开发的方式有多种:

1.3 排版约定

本节为非规范性内容。

本规范中使用以下排版约定:

markup
标记(元素、属性、属性值)、可机器处理的值(字符串、字符、媒体类型)、属性名或文件名使用红橙色等宽字体显示。
variable
伪代码或算法描述中的变量以斜体显示。
definition
用于在本规范或其他规范中引用的术语定义以粗体斜体显示。
definition reference
对本文档中定义项的引用以带下划线显示,并且也是指向定义本身的活动链接。
markup definition reference
对本文档中定义项的引用(当引用本身也是标记时)以下划线、红橙色等宽字体显示,并且也是指向定义本身的活动链接。
external definition reference
对其他文档中定义项的引用以下划线斜体显示,并且也是指向定义本身的活动链接。
markup external definition reference
对其他文档中定义项的引用(当引用本身也是标记时)以下划线、斜体、红橙色等宽字体显示,并且也是指向定义本身的活动链接。
hyperlink
超链接以下划线并使用蓝色显示。
[reference]
文档引用(规范性或信息性)用方括号括起并链接到参考文献部分。
Changes from Recommendation
自上一推荐版本更改的章节或短语可以通过 § 1.1 How to Read this Document 中的控件加以 高亮

注以浅绿色框显示,左侧带绿色边框,并带有绿色的“Note”标题。注始终为信息性内容。

示例以浅黄褐色框显示,左侧带黄褐色边框,并带有编号的“示例”标题(黄褐色)。
示例始终为信息性内容。示例内容使用等宽字体,并可做语法着色。

示例可包含选项卡式导航按钮
以展示将示例转换为其他表示形式的结果。

1.4 术语

本节为非规范性内容。

本文档使用下列在外部规范中定义的术语,并定义了特定于 JSON-LD 的术语。

从其他规范导入的术语

下列术语从 ECMAScript Language Specification [ECMASCRIPT]、The JavaScript Object Notation (JSON) Data Interchange Format [RFC8259]、Infra Standard [INFRA] 以及 Web IDL [WEBIDL] 导入。

array
在 JSON 序列化中,array 结构由方括号包围零个或多个值表示,值之间以逗号分隔。在 内部表示 中,list(也称为 array)是一个有序的零个或多个值的集合。虽然 JSON-LD 使用与 JSON 相同的 array 表示,但默认情况下该集合是无序的。常规 JSON 数组会保留顺序,而常规 JSON-LD 数组除非另有定义,否则不保留顺序(见 JSON-LD 1.1 的 Sets and Lists 部分)。
boolean
用于表示两种可能状态之一的值 truefalse
JSON object
在 JSON 序列化中,object 结构由花括号包围零个或多个名/值对(或成员)表示。名称为一个 string。每个名称后有一个冒号分隔名称与值。值与下一名称之间用逗号分隔。在 JSON-LD 中,对象中的名称必须唯一。

内部表示 中,JSON object 被描述为一个 map(参见 [INFRA]),由具有键/值对的 entries 组成。

API 中,map 使用 [WEBIDL] 的 record 描述。

null
在 JSON-LD 中使用 null 值用于忽略或重置值。若 @context 中的某个 map entry 的值或该值的 @idnull,则明确地断开该术语与 IRI 的关联。若 JSON-LD 文档主体中的某个 map entry 的值为 null,则其效果等同于该 map entry 未被定义。如果在扩展形式中将 @value@list@set 设置为 null,则整个 JSON object 将被忽略。
number
在 JSON 序列化中,number 与大多数编程语言中使用的类似,但不使用八进制或十六进制格式且不允许前导零。在 内部表示 中,number 等同于 longdouble,这取决于该数字是否具有非零的小数部分(参见 [WEBIDL])。
scalar
scalar 是 stringnumbertruefalse 之一。
string
string 是由零个或多个 Unicode(UTF-8)字符组成的序列,用双引号括起,并在必要时使用反斜杠转义。一个字符表示为单字符字符串。

Internationalized Resource Identifiers (IRIs) [RFC3987] 导入的术语

IRI
绝对形式的 IRI,包含一个 scheme 以及 path,并可带可选的 queryfragment 段。
IRI reference
表示 IRI 的常见用法。IRI reference 可以是绝对的或 相对的。然而,由此引用解析得到的 "IRI" 仅包含绝对的 IRIs;任何 相对 IRI 引用 都会被解析为其绝对形式。
relative IRI reference
相对 IRI 引用是相对于另一个 IRI 的引用,通常是文档的 base IRI。注意,被定义为 vocabulary relative 的属性、@type 的值以及术语的值会相对于 vocabulary mapping 解析,而不是相对于 base IRI

RDF 1.1 Concepts and Abstract SyntaxRDF Schema 1.1 以及 Linked Data Design Issues 导入的术语

base IRI
base IRI 是在 context 中建立的 IRI,或基于 JSON-LD document 的位置。base IRI 用于将 相对 IRI 引用 转换为绝对的 IRI。
blank node
在图中既不是 IRI 也不是 literalnode。blank node 不包含可解引用的标识符,因为它本质上是临时的或不包含需要从图外部链接的信息。在 JSON-LD 中,blank node 会被分配以 _: 为前缀的标识符。
blank node identifier
blank node identifier 是一个可在 JSON-LD 文档范围内用作 blank node 标识符的字符串。blank node identifiers 以 _: 开头。
dataset
dataset 表示一组 RDF graphs 的集合,包括恰好一个 default graph 以及零个或多个 named graphs
datatype IRI
datatype IRI 是一个 IRI,用以标识一个数据类型,该数据类型决定了词汇形式如何映射为 literal value
default graph
dataset 的 default graph 是一个没有 name 的 RDF graph,可能为空。
graph name
标识 named graph 的 IRI 或 blank node。
language-tagged string
language-tagged string 由字符串和非空的语言标签组成,语言标签按 [BCP47] 定义。language tag 必须符合 [BCP47 第 2.2.9 节] 的格式。处理器可以将 language tags 规范化为小写。
Linked Data
一组文档,每个文档包含一个 linked data graph 或 dataset 的表示。
list
list 是 IRI、blank nodes 和 literals 的有序序列。
literal
literal 是以值表示的 object,例如 stringnumber。literal 隐式或显式包含一个 datatype IRI,并且如果 datatype 为 rdf:langString,则还可以包含可选的语言标签。
named graph
named graph 是由 IRI 或 blank node 标识的 linked data graph。
node
node 是 RDF graph 中的一个节点,至少在一个 triple 中作为 subject 或 object 出现。注意 node 在同一图中甚至同一 triple 中可同时扮演 subject 和 object 的角色。
object
object 是 linked data graph 中至少有一个入边的 node。
property
property 是 linked data graph 中有向弧的名称。每个 property 都是定向的,并以 IRI 或 blank node identifier 标注。尽可能应使用 IRI 来标注 property。
使用 blank node identifiers 来标注 properties 已过时,并可能在未来的 JSON-LD 版本中移除。
另请参见 RDF11-CONCEPTS 中的 predicate
RDF graph
标注的有向图,即由有向弧连接的节点集合,也称为 linked data graph。
resource
由 IRI、blank node 或 literal 表示的资源,代表现实世界中的某个事物(“讨论宇宙”)。
subject
subject 是 linked data graph 中至少有一条出边的 node,通过 property 与 object node 相关联。
triple
triple 是 RDF graph 的组成部分,包含 subject、predicate 和 object,表示图中的 node-arc-node 段。

JSON-LD 特定术语定义

active context
active context 是在处理算法运行期间用于解析 termscontext
base direction
base direction 是在字符串没有直接关联方向时使用的方向。它可在 context 中通过 @direction 键设置,其值必须为字符串之一:"ltr""rtl"null。详见 JSON-LD 1.1 的 Context Definitions 部分的规范描述。
compact IRI
compact IRI 形式为 prefix:suffix,用于在不为每个 IRI 定义独立术语定义的情况下表达 IRI,适用于由 prefix 标识的共同词汇。
context
context 是用于解释 JSON-LD document 的一组规则,如 JSON-LD 1.1 的 The Context 部分所述,并在 Context Definitions 部分中进行规范性说明。
default language
default language 是在字符串没有直接关联语言时使用的语言。它可在 context 中使用 @language 键设置,其值必须是表示 [BCP47] 语言代码的字符串或 null。详见 Context Definitions 部分的规范描述。
default object
default object 是具有 @default 键的 map
embedded context
embedded context 是出现在下列之一的 @context 条目的 context:node objectvalue objectgraph objectlist objectset object、嵌套属性的值,或扩展术语定义的值。其值可以是用于 context definition 的 map,或一个 IRI,或组合上述任一项的数组。
expanded term definition
expanded term definition 是一种 term definition,其值是一个 map,包含一个或多个 keyword 键以定义关联的 IRI;如果这是一个反向属性,则定义与字符串值关联的类型及容器映射。详见 JSON-LD 1.1 的 Expanded Term Definition 部分的规范描述。
frame
frame 是一个 JSON-LD document,用于描述如何使用匹配和嵌入规则转换另一个 JSON-LD 文档。frame 文档允许使用额外关键字和某些 map entries 来描述匹配与转换过程。
frame object
frame object 是 frame 中的一个 map 元素,表示输入中与之匹配的 node object 或 value object 的特定部分。详见 JSON-LD 1.1 的 Frame Objects 部分。
graph object
graph object 表示作为 node object 中某个 map entry 值的 named graph。扩展后,graph object 必须具有 @graph 条目,且可选地具有 @id@index 条目。simple graph object 是不含 @id 条目的 graph object。注意 node objects 可以有 @graph 条目,但如果还包含其他条目则不被视为 graph objects。顶层仅包含 @graph 的对象也不被视为 graph object。node object 若包含其他属性,也可表示 named graph。详见 JSON-LD 1.1 的 Graph Objects 部分。
id map
id map 是将某个 term 定义为 @container@id 时该 term 的 map 值。id map 的值必须是 node objects,其键被解释为表示关联 node object 的 @id 的 IRI。如果 id map 中的某个值包含可扩展为 @id 的键,则其值必须等同于 id map 中的引用键。详见 Id Maps 部分。
implicitly named graph
implicitly named graph 是由某个 map entry 的值创建的 named graph,该 map entry 的扩展术语定义中将 @container 设置为 @graph
included block
included block 是 node object 中的一个 entry,其键为 @included 或其别名,且值为一个或多个 node objects。详见 Included Blocks 部分。
index map
index map 是将某个 term 定义为 @container@index 时该 term 的 map 值,其值必须为下列类型之一:string、number、truefalse、null、node object、value object、list object、set object,或上述类型的数组。详见 Index Maps 部分。
JSON literal
JSON literal 是一种 literal,其关联的 datatype IRI 为 rdf:JSON。在 value object 表示中,@type 的值为 @json。JSON literals 表示的值是有效的 JSON。详见 JSON-LD 1.1 中的 The rdf:JSON Datatype 部分。
JSON-LD document
JSON-LD document 是 RDF dataset 的一种序列化。详见 JSON-LD 1.1 的 JSON-LD Grammar 部分。
JSON-LD internal representation
JSON-LD internal representation 是将 JSON 语法结构转换为适合直接处理的核心数据结构的结果:arrays、maps、strings、numbers、booleans 和 null。
JSON-LD Processor
JSON-LD Processor 是可以执行 JSON-LD 1.1 Processing Algorithms and API 中定义算法的系统。详见 JSON-LD 1.1 API 的 Conformance 部分。
JSON-LD value
JSON-LD value 是 string、number、truefalse、typed value 或 language-tagged string 之一。它表示一个 RDF literal。
keyword
keyword 是特定于 JSON-LD 的字符串,在 JSON-LD 1.1 的 Syntax Tokens and Keywords 部分中描述,并在 Keywords 部分中作规范性说明。
language map
language map 是将某个 term 定义为 @container@language 时该 term 的 map 值,其键必须为表示 BCP47 语言代码的字符串,值必须为 null、string,或上述可能性的数组。详见 Language Maps 部分。
list object
list object 是一个具有 @list 键的 map。它也可以有 @index 键,但不得包含其他条目。详见 Lists and Sets 部分。
local context
local context 是通过 @context keyword 指定且以 map 形式出现的 context。
nested property
nested property 是 node object 中的一个键,其值为包含若干 entries 的 map,这些 entries 被视为该 node object 的值。nested property 本身在语义上无意义,仅用于在 node object 内创建子结构。详见 Property Nesting 部分。
node object
node object 表示由 JSON-LD document 序列化的图中某一 node 的零个或多个 properties。若一个 map 存在于 JSON-LD context 之外并且不包含 @value@list@set,且不是仅由 @graph@context 组成的顶层 map,则该 map 被视为 node object。node object 中非关键字的 entries 亦称为该 node object 的 properties。详见 Node Objects 部分。
node reference
node reference 是仅含 @id 键的 node object,用于引用某个 node。
prefix
prefix 是 compact IRI 的第一部分,来自映射到某字符串的 term,当将该字符串加在 compact IRI 的后缀前时,会得到一个完整的 IRI。
processing mode
processing mode 定义 JSON-LD document 的处理方式。默认情况下,所有文档均被假定符合本规范。发布者可在 context 中使用 @version 条目定义不同版本,以确保符合 JSON-LD 1.0 的处理器不会错误地处理 JSON-LD 1.1 文档。API 提供将 processing mode 设置为 json-ld-1.0 的选项,以防止 JSON-LD 1.1 特性被启用,或在 context 的 @version 被显式设置为 1.1 时产生错误。本规范通过 json-ld-1.1 processing mode 扩展 JSON-LD 1.0。
scoped context
scoped context 是 expanded term definition 中使用 @context 条目的一部分,其形式与 embedded context 相同。当该 term 用作 type 时,定义为 type-scoped context;当用作 property 时,定义为 property-scoped context。
set object
set object 是具有 @set 条目的 map。它也可有 @index 键,但不得包含其他条目。详见 Lists and Sets 部分。
term
term 是在 context 中定义的短词,可被扩展为 IRI。详见 Terms 部分。
term definition
term definition 是 context 中的一个条目,该键定义一个可在 map 中作为键、类型或其他位置使用的 term,其值要么为一个扩展为 IRI 的字符串(simple term definition),要么为一个 map(expanded term definition)。
type map
type map 是将某个 term 定义为 @container@type 时该 term 的 map 值,其键被解释为表示关联 node object 的 @type 的 IRI;值必须为 node object 或 node objects 的数组。若值包含扩展为 @type 的 term,则在扩展时其值会与 map 值合并。详见 Type Maps 部分。
typed value
typed value 由一个值(string)和一个类型(IRI)组成。
value object
value object 是具有 @value 条目的 map。详见 Value Objects 部分。
vocabulary mapping
vocabulary mapping 在 context 中通过 @vocab 键设置,其值必须是 IRI、compact IRI、term,或 null。详见 Context Definitions 部分的规范描述。

1.5 设计目标与基本原理

本节为非规范性内容。

JSON-LD 满足下列设计目标:

Simplicity
在最基本的形式下使用 JSON-LD 不需要额外的处理器或软件库。该语言为开发者提供了非常低的学习曲线。不关心链接数据的开发者只需理解 JSON,并知道可以包含但忽略 @context 属性,即可使用 JSON-LD 的基本功能。
Compatibility
JSON-LD 文档始终是有效的 JSON 文档。这确保所有标准的 JSON 库能够与 JSON-LD 文档无缝工作。
Expressiveness
该语法序列化标注的有向图,从而确保几乎所有现实世界的数据模型都可以表达。
Terseness
JSON-LD 语法简洁且易于阅读,对开发者而言尽可能减少工作量。
Zero Edits, most of the time
JSON-LD 确保从现有基于 JSON 的系统平滑且简单地迁移。在许多情况下,对 JSON 文档无需修改,仅在 HTTP 响应中添加一行即可(见 § 6.1 Interpreting JSON as JSON-LD)。这使得已经部署大量基于 JSON 基础设施的组织能够以不干扰日常运营且对现有用户透明的方式使用 JSON-LD 的功能。然而,有时将 JSON 映射为图表示是一个复杂的任务。在这些情况下,与其为支持这些深奥用例而增加语言复杂性,我们选择不支持这些用例。虽然 Zero Edits 是一个设计目标,但在不引入巨量复杂性的前提下并非总是可行。JSON-LD 在可能时优先关注简洁性。
Usable as RDF
JSON-LD 可被开发者作为惯用的 JSON 使用,无需理解 RDF [RDF11-CONCEPTS]。JSON-LD 也可用作 RDF,因此打算将 JSON-LD 与 RDF 工具一起使用的人会发现它可以像其他 RDF 语法一样使用。JSON-LD 与 RDF 的完整关系详见第 § 10. Relationship to RDF 节。

1.6 数据模型概述

本节为非规范性内容。

一般而言,由 JSON-LD document 描述的数据模型是一个标注的、有向的 graph。该图包含由有向弧连接的 nodes。一个 node 要么是具有 properties 的 resource,要么是这些 properties 的数据值,包括 stringsnumberstyped values(如日期和时间)以及 IRIs。

在有向图中,nodes 是 resources,并且可能是 未命名的,即不由 IRI 标识;这类节点称为 blank nodes,可以使用 blank node identifier 来标识。这些标识符在使用树结构(例如 JSON)表示一个完全连接的图时可能是必需的,但除此之外并无固有意义。字面值(如 strings 和 numbers)也被视为 resources,JSON-LD 区分 node objectsvalue objects,以区分不同类型的 resource。

这一简单的数据模型非常灵活且强大,能够建模几乎任何类型的数据。欲深入了解该数据模型,请参见第 § 8. Data Model 节。

熟悉链接数据技术的开发者会认出该数据模型即为 RDF 数据模型。要更深入了解 JSON-LD 与 RDF 的关系,请参见第 § 10. Relationship to RDF 节。

在表面层面,JSON-LD document 仅仅是 JSON,详见 [RFC8259]。为描述核心数据结构之目的,本文限定为 arrays、maps(作为 JSON Object 的解析版本)、strings、numbers、booleans 和 null,称为 JSON-LD internal representation。这使得除 JSON 以外的表面语法在映射到等效的核心数据结构时也能使用相同算法进行处理

尽管本文档未予讨论,使用 YAML(YAML™ Version 1.2)和诸如 CBOR 之类的二进制表示可以映射到 internal representation,从而使 JSON-LD 1.1 API [JSON-LD11-API] 能像源是 JSON 文档一样运行。

1.7 语法标记与关键字

本节为非规范性内容。

JSON-LD 指定了若干语法标记和 keywords,它们是该语言的核心部分。关于这些 keywords 的规范性描述见 § 9.16 Keywords

:
用于使用 compact IRIs 的 JSON 键和值之间的分隔符。
@base
用于设置用于解析那些否则相对于文档解释的相对 IRI 引用的 base IRI。该关键字在 § 4.1.3 Base IRI 中描述。
@container
用于设置某个 term 的默认容器类型。该关键字在下列章节中描述:
@context
用于定义在整个 JSON-LD 文档中使用的短名称(称为 terms),以便开发者以紧凑的方式表达特定标识符。@context 关键字在 § 3.1 The Context 中详细描述。
@direction
用于设置非 typed values(例如 strings 或 language-tagged strings)的 JSON-LD value 的 base direction。此关键字在 § 4.2.4 String Internationalization 中描述。
@graph
用于表达一个 graph。该关键字在 § 4.9 Named Graphs 中描述。
@id
用于唯一标识文档中被描述的 node objects,使用 IRIs 或 blank node identifiers。该关键字在 § 3.3 Node Identifiers 中描述。仅包含 @id 属性的 node object 称为 node reference,可表示对文档中其他位置 node object 的引用。
@import
在 context definition 中用于加载外部 context,并将其与包含该条目的 context definition 合并。这对于向 JSON-LD 1.0 的 contexts 添加 JSON-LD 1.1 功能很有用。
@included
在顶层 node object 中用于定义 included block,以便在另一个 node object 中包含次级的 node objects。
@index
用于指定某个容器用于索引信息,并指示处理应深入 JSON 数据结构。该关键字在 § 4.6.1 Data Indexing 中描述。
@json
作为 JSON literal 的 @type 值使用。该关键字在 § 4.2.2 JSON Literals 中描述。
@language
用于指定某个字符串值的语言或 JSON-LD 文档的默认语言。该关键字在 § 4.2.4 String Internationalization 中描述。
@list
用于表达有序的数据集合。该关键字在 § 4.3.1 Lists 中描述。
@nest
用于定义 node object 的一个 property,该 property 将该节点的若干 properties 组合在一起,但并不是图中的边。
@none
用作 index map、id map、language map、type map 或其他用于索引值的 map 的索引值,当被索引的节点不具备被索引的特征时使用。
@prefix
当值为 true 时,允许该 term 在紧凑化时用于构造 compact IRI;当值为 false 时,禁止该 term 用于构造 compact IRI。它还决定在扩展 compact IRIs 时是否考虑该 term。
@propagate
在 context definition 中用于改变该 context 的作用域。默认值为 true,表示 contexts 会跨 node objects 传播(type-scoped contexts 的默认值为 false)。将其设置为 false 会导致在进入新的 node object 时移除在该 context 中创建的 term 定义。
@protected
用于防止某个 context 的 term definitions 被其他 context 覆盖。该关键字在 § 4.1.11 Protected Term Definitions 中描述。
@reverse
用于表达反向属性。该关键字在 § 4.8 Reverse Properties 中描述。
@set
用于表达无序的数据集合并确保值始终以数组表示。该关键字在 § 4.3.2 Sets 中描述。
@type
用于设置 node 的类型或 typed value 的数据类型。该关键字在 § 3.5 Specifying the Type§ 4.2.1 Typed Values 中有进一步说明。
使用 @type 来为 node objects 和 value objects 同时定义类型可满足对数据进行类型化的基本需求,无论它是一个字面值还是更复杂的资源。专家可能会对 @type 关键字的双重用法有所顾虑,但应注意多年来 Web 开发者对此功能的使用并未导致其被滥用,因为 @type 用于表示类型化字面值的情况相对较少。
@value
用于指定与图中某个 property 相关联的数据。该关键字在 § 4.2.4 String Internationalization§ 4.2.1 Typed Values 中描述。
@version
在 context definition 中用于设置 processing mode。自 JSON-LD 1.0 以来在本规范中描述的新特性在 processing mode 显式设置为 json-ld-1.0 时不可用。
在 context definition 中 @version 采用的具体值为 1.1(而不是 "json-ld-1.1"),因为 JSON-LD 1.0 处理器可能接受字符串形式的 @version,但会拒绝数值形式。
@version 的值设为 1.1 旨在使 JSON-LD 1.0 处理器停止处理。尽管该值显然与 JSON-LD 1.1 相关,但它并不遵循 语义化版本控制 的要求。
@vocab
用于使用通用前缀扩展 properties 和 @type 中的值为 IRI。该关键字在 § 4.1.2 Default Vocabulary 中描述。

JSON-LD 中的所有键、keywords 和数值均区分大小写。

2. 一致性

除标注为非规范性的章节外,本规范中的所有撰写指南、图示、示例和注释均为非规范性。规范中的其余内容为规范性。

文档中的关键字 MAYMUSTMUST NOTRECOMMENDEDSHOULDSHOULD NOT 的解释应当与 BCP 14 [RFC2119] [RFC8174] 中所述的解释相同,但仅在这些关键字全部以大写形式出现时适用。

JSON-LD document 若遵循附录 § 9. JSON-LD Grammar 中的规范性陈述,则视为符合本规范。JSON 文档可通过遵循 § 6.1 将 JSON 解释为 JSON-LD 中的规范性陈述来被解释为 JSON-LD。为方便起见,关于文档的规范性陈述常以对文档属性的表述形式给出。

本规范使用下列命名空间前缀:

前缀 IRI
dc11 http://purl.org/dc/elements/1.1/
dcterms http://purl.org/dc/terms/
cred https://w3id.org/credentials#
foaf http://xmlns.com/foaf/0.1/
geojson https://purl.org/geojson/vocab#
prov http://www.w3.org/ns/prov#
i18n https://www.w3.org/ns/i18n#
rdf http://www.w3.org/1999/02/22-rdf-syntax-ns#
schema http://schema.org/
skos http://www.w3.org/2004/02/skos/core#
xsd http://www.w3.org/2001/XMLSchema#

这些前缀可在本文档中作为 compact IRI 的简写使用,用来表示相应的 IRI,例如 dcterms:title 用来表示 http://purl.org/dc/terms/title

3. 基本概念

本节为非规范性内容。

JSON [RFC8259] 是一种轻量级的、与语言无关的数据交换格式,易于解析与生成。然而,将来自不同来源的 JSON 数据整合起来可能很困难,因为数据中可能包含与其他数据源冲突的键。此外,JSON 本身并不内建对超链接的支持,而超链接是 Web 的基本构建块。下面先看一个示例,该示例将在本节剩余部分中反复使用:

示例 2: 示例 JSON 文档
{
  "name": "Manu Sporny",
  "homepage": "http://manu.sporny.org/",
  "image": "http://manu.sporny.org/images/manu.png"
}

对人类来说很明显这些数据描述的是一个人的信息,其中 name 为 "Manu Sporny",homepage 属性包含该人的主页 URL。但对于机器而言并没有这种直观理解,有时即便对人类也不易解析此类表示中的歧义。通过使用明确无歧义的标识符来表示不同概念,而不是使用诸如 "name"、"homepage" 之类的普通标记,就可以解决这一问题。

链接数据以及 Web 通常使用 IRIs (如 [RFC3987] 所述)来进行无歧义标识。其思想是用 IRIs 为可能被其他开发者利用的数据分配明确标识符。对诸如 namehomepage 这样的 terms 进行 IRI 扩展是有用的,这样开发者就不会无意中使用相同的术语。此外,开发者和机器能够使用该 IRI(例如通过 web 浏览器)访问该术语并获取其含义的定义。这个过程称为 IRI 反解(dereferencing)。

借助流行的 schema.org 词汇,上例可被明确地表达如下:

在上例中,每个属性都由一个 IRI 明确标识,且所有表示为 IRIs 的值都用 @id keyword 明确标注。尽管这是一个非常具体的、有效的 JSON-LD 文档,但对人类开发者而言过于冗长且不易处理。为了解决这一问题,JSON-LD 引入了下一节将要描述的 context 概念。

本节仅涵盖 JSON-LD 的最基本功能。更多高级功能,包括 typed valuesindexed values 以及 named graphs, 可见 § 4. 高级概念

3.1 上下文

本节为非规范性内容。

当两个人互相交流时,对话发生在一个共享的环境中,通常称为“对话的上下文”。这种共享的上下文允许双方使用快捷术语(例如共同朋友的名字)进行更快速的交流而不丢失精确性。JSON-LD 中的上下文以相同方式工作:它允许两个应用使用快捷术语更高效地互相通信,同时保持语义上的准确性。

简单来说,context 用于将 terms 映射到 IRIsTerms 区分大小写,且大多数不是保留的 JSON-LD keywords 的有效字符串都可以用作 term例外情况包括空字符串 "" 以及形式像关键字的字符串(即以 "@" 开头且随后全部由一个或多个 ALPHA 字符组成的字符串(参见 [RFC5234])),这些不得用作术语。形式上像 IRI(例如包含 ":")的字符串也不应被用作术语。

对于上节的示例文档,一个 context 大致如下所示:

示例 4: 用于上一节示例文档的上下文
{
  "@context": {
    "name": "http://schema.org/name",
    ↑ This means that 'name' is shorthand for 'http://schema.org/name'
    "image": {
      "@id": "http://schema.org/image",
      ↑ This means that 'image' is shorthand for 'http://schema.org/image'
      "@type": "@id"
      ↑ This means that a string value associated with 'image'
        should be interpreted as an identifier that is an IRI
    },
    "homepage": {
      "@id": "http://schema.org/url",
      ↑ This means that 'homepage' is shorthand for 'http://schema.org/url'
      "@type": "@id"
      ↑ This means that a string value associated with 'homepage'
        should be interpreted as an identifier that is an IRI 
    }
  }
}

如上所示,context 中的 term definition 的值可以是一个简单字符串(将 term 映射到一个 IRI),也可以是一个 map

可以通过键为 @contextentry 引入一个 context,它可以出现在 node objectvalue object 中。

当以 term 为键的 entry 的值是一个 map 时,该 map 被称为 expanded term definition。上例说明了若 imagehomepage 的值为字符串,则应将其解释为 IRIs扩展术语定义 还允许使用术语来构建 index maps,以及指定数组值应解释为 sets 还是 lists。扩展术语定义可使用 IRI 或 compact IRIs 作为键,这主要用于将类型或语言信息与 IRI 或 compact IRI 关联。

Contexts 可以直接嵌入文档(称为 embedded context),也可以通过 URL 引用。假设上例中的上下文文档可在 https://json-ld.org/contexts/person.jsonld 获取,则可以通过添加一行引用来引用它,从而使 JSON-LD 文档能够更简洁地表达,如下所示:

被引用的上下文不仅规定了术语如何映射到 Schema.org 词汇中的 IRIs,还规定了与 homepageimage 属性关联的字符串值可以解释为 IRI(即 "@type": "@id",详见 § 3.2 IRIs)。这些信息使开发者能够重用彼此的数据而无需在站点级别达成数据互操作的约定。外部的 JSON-LD 上下文文档可能包含位于 @context 键之外的额外信息,例如对文档中声明术语的文档说明。当文档作为外部 JSON-LD context document 使用时,@context 值之外的信息将被忽略。

远程上下文也可以使用相对 URL 引用,并相对于包含引用的文档的位置进行解析。例如,如果某文档位于 http://example.org/document.jsonld 并包含对 context.jsonld 的相对引用,则所引用的上下文文档位于 http://example.org/context.jsonld

示例 6: 加载相对上下文
{
  "@context": "context.jsonld",
  "name": "Manu Sporny",
  "homepage": "http://manu.sporny.org/",
  "image": "http://manu.sporny.org/images/manu.png"
}

对上下文 URL 的相对引用的解析同样适用于远程上下文文档,因为它们自身可能包含对其他上下文的引用。

JSON 文档可以通过在 HTTP Link Header 中引用 context(如 RFC8288 所述)而无需修改即可被解释为 JSON-LD,详见 § 6.1 Interpreting JSON as JSON-LD。也可以使用 JSON-LD 1.1 API 应用自定义上下文 [JSON-LD11-API]。

JSON-LD documents 中,contexts 也可以以内联方式指定。这样做的优点是即使在无法连接到 Web 的情况下也能处理文档。最终这是一个建模决策,不同用例可能需要不同处理。关于使用远程上下文的讨论,请参见 安全考虑,位于 § C. IANA Considerations

本节仅覆盖 JSON-LD 上下文的最基本特性。上下文还可用于帮助解释更复杂的 JSON 数据结构,例如 indexed values有序值 以及 嵌套属性。与 JSON-LD 上下文相关的更多高级特性载于 § 4. 高级概念

3.2 IRIs

本节为非规范性内容。

IRIs([RFC3987] 所述的 Internationalized Resource Identifiers)是链接数据的基础,因为大多数 nodesproperties 正是通过它们来标识。在 JSON-LD 中,IRIs 可以表示为 IRI reference。IRI 在 RFC3987 中定义为包含一个 schemepath 以及可选的 queryfragment 段。相对 IRI 引用 是相对于另一个 IRI 的引用。在 JSON-LD 中,除下文描述的例外情况外,所有相对 IRI 引用都相对于 base IRI 进行解析。

正如在 § 1.1 如何阅读本文档 中所述,IRIs 常被与 URLs 混淆(URL 为 Uniform Resource Locators),两者的主要区别在于 URL 用于在网络上 定位 资源,而 IRI 用于 标识 资源。尽管将资源标识符设计为可解析(dereferenceable)是良好实践,但有时并不实际。特别需要注意的是用于标识名称的 [URN] 方案,例如 UUID,例如 urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6

Properties@type 的值,以及那些在 term definition 中被定义为相对于 vocabulary mapping 的 properties 的值,可能采用 相对 IRI 引用 的形式,但其解析应使用 vocabulary mapping 而非 base IRI

当一个 字符串 是键为 @idmap entry 的值时,该字符串将被解释为 IRI

示例 8: @id 的值被解释为 IRI
{
  ...
  "homepage": { "@id": "http://example.com/" }
  ...
}

被解释为 IRIs 的值也可以表示为 相对 IRI 引用。例如,假设下列文档位于 http://example.com/about/,则相对 IRI 引用 ../ 会扩展为 http://example.com/(有关相对 IRI 引用可用位置的更多信息,请参阅 § 9. JSON-LD Grammar)。

示例 9: IRI 可以是相对的
{
  ...
  "homepage": { "@id": "../" }
  ...
}

IRIs 也可以直接出现在键的位置,例如:

示例 10: 将 IRI 用作键
{
  ...
  "http://schema.org/name": "Manu Sporny",
  ...
}

在上例中,键 http://schema.org/name 被解释为一个 IRI

若键与 active context 中定义的 term 匹配,则会进行术语到 IRI 的扩展:

那些不能扩展为 IRI 的 JSON 键(例如上例中的 status)并非链接数据,因此在处理时会被忽略。

如果在 @context 中为某个 term 或属性的 IRI 指定了类型 coercion 规则,则会生成一个 IRI:

在上例中,由于值 http://manu.sporny.org/ 以 JSON 字符串形式给出,类型强制规则会在处理数据时将该字符串转换为 IRI。有关此特性的更多细节,请参见 § 4.2.3 Type Coercion

综上,IRIs 在 JSON-LD 中可以通过多种方式表达:

  1. 映射条目,其键映射到术语(位于活动上下文中)时,会展开为一个IRI(仅适用于上下文定义之外)。
  2. 对于使用 @id@type 指定的字符串值,会生成一个IRI
  3. 对于任何键的字符串值,如果存在包含一个且其值被设置为 @id@vocab强制转换 规则,则会为该字符串值生成一个IRI

本节仅介绍了 JSON-LD 中与 IRI 相关的最基本特性。与 IRI 相关的更多高级特性请参见 § 4. 高级概念

3.3 节点标识符

本节为非规范性内容。

为了能够在 RDF graph 中从外部引用 nodes,重要的是这些 nodes 必须有标识符。IRIs 是链接数据的一个基本概念;若要真正实现节点之间的链接,反解该标识符应当能返回该节点的表示,这样应用就可以检索有关该节点的更多信息。

在 JSON-LD 中,节点由 @id keyword 标识:

上例包含了一个由 IRI http://me.markus-lanthaler.com/ 标识的 node object

本节仅涵盖与 JSON-LD 中节点标识符相关的最基本特性。与节点标识符相关的更多高级特性见 § 4. 高级概念

3.4 JSON 对象的用途

本节为非规范性内容。

作为一种语法,JSON 仅包含有限的语法要素:

JSON-LD 数据模型允许基于 RDF 数据模型的更丰富的资源集合。该数据模型在 § 8. 数据模型 中有更完整的描述。JSON-LD 使用 JSON 对象来描述各种资源以及这些资源之间的关系:

Node objects
Node objects 用于定义在 linked data graph 中可能既有入边也有出边的节点。Node objects 是定义具有 propertiesresources 的主要结构。关于规范性定义见 § 9.2 Node Objects
Value objects
Value objects 用于描述在 linked data graph 中仅可能具有入边的文字节点。在 JSON 中,某些文字节点可以无需使用 JSON 对象来描述(例如 numbersstringsboolean 值),但在 expanded form 中,所有文字节点皆以 value objects 来描述。更多信息见 § 4.2 描述值,规范性定义见 § 9.5 Value Objects
List Objects and Set objects
List Objects 是一种特殊的 JSON-LD maps,不同于 node objectsvalue objects,用于通过在 @list 键下将一个 array 包装在一个 map 中来表示有序值。Set Objects 为一致性而存在,其等价于 @set 键的数组值。详见 § 4.3.1 Lists§ 4.3.2 Sets
Map Objects
JSON-LD 使用各种形式的 maps,以便更容易访问某个 property 的值。
Language Maps
允许通过 language tag 对具有不同语言的多个值进行索引。更多信息见 § 4.6.2 语言索引,规范性定义见 § 9.8 Language Maps
Index Maps
允许多个值(node objectsvalue objects)按关联的 @index 进行索引。更多信息见 § 4.6.1 数据索引,规范性定义见 § 9.9 Index Maps
Id Maps
允许多个 node objects 按关联的 @id 进行索引。更多信息见 § 4.6.3 节点标识符索引,规范性定义见 § 9.11 Id Maps
Type Maps
允许多个 node objects 按关联的 @type 进行索引。更多信息见 § 4.6.4 节点类型索引,规范性定义见 § 9.12 Type Maps
Named Graph Indexing
允许多个 named graphs 按关联的 graph name 进行索引。更多信息见 § 4.9.3 命名图索引
Graph objects
graph objectnode object 类似,但其定义的是一个 named graph。更多信息见 § 4.9 Named Graphs,规范性定义见 § 9.4 Graph Objects。一个 node object 也可以在描述该节点的其他属性的同时表示一个 named graph。显著差别在于 graph object 仅描述一个 named graph。
Context Definitions
Context Definition 使用 JSON object 形式,但它本身并不是 linked data graph 中的数据。Context Definition 也可以包含以 JSON 对象表示的扩展术语定义。更多信息见 § 3.1 The Context§ 4.1 高级上下文用法,规范性定义见 § 9.15 Context Definitions

3.5 指定类型

本节为非规范性内容。

在链接数据中,常常需要为图节点指定类型;在许多情况下,可以根据给定 node object 中使用的属性或该节点作为值的属性来推断类型。例如,在 schema.org 词汇中,属性 givenNamePerson 相关联。因此,如果某个 node object 包含属性 givenName,则可以推断其类型为 Person;使用 @type 明确指定有助于澄清这种关联。

可以使用 @type keyword 来为某个节点指定类型。在链接数据中,类型以唯一的 IRI 标识。

可以通过使用 数组 为节点指定多个类型:

@type 键的值也可以是 active context 中定义的一个术语:

除了为节点设置类型之外,@type 还可以用于为一个值设置类型,从而创建 typed value。此用法类似于为 node object 定义类型,但 value objects 被限制为仅具有单个类型。关于此用途的更详细讨论见 § 4.2.1 Typed Values

还可以通过在扩展术语定义中隐式定义 @type 来定义 typed values。此内容在 § 4.2.3 Type Coercion 中有更完整的覆盖。

4. 高级概念

本节为非规范性内容。

JSON-LD 提供若干超出前述核心功能的特性。可使用 JSON 来表达采用这些结构的数据,本节描述的特性可用于将各种不同的 JSON 结构解释为链接数据。JSON-LD 处理器会利用提供的和嵌入的上下文,以多种惯用方式解释属性值。

描述值

JSON 中常见的一种模式是属性的值为字符串。通常该字符串实际上表示某种其他的类型化值,例如 IRI、日期,或某种特定语言的字符串。关于如何描述此类值的类型化,请参见 § 4.2 描述值

值的顺序

在 JSON 中,属性若为数组值则暗含一种隐式顺序;默认情况下,JSON-LD 中的数组并不表示其包含元素具有任何顺序,除非通过嵌入结构或通过上下文定义来定义顺序。有关详细讨论,请参见 § 4.3 值的顺序

属性嵌套

在 API 中常见的另一个 JSON 惯用法是使用中间对象来将对象的相关属性分组;在 JSON-LD 中这些称为 嵌套属性,详见 § 4.4 嵌套属性

引用对象

链接数据关注的是描述不同资源之间的关系。有时这些关系是在 Web 上不同文档定义的资源之间,有时资源在同一文档内被描述。

在此情形中,位于 http://manu.sporny.org/about 的文档可能包含上例,并引用位于 https://greggkellogg.net/foaf 的另一个文档,该文档也可能包含类似的表示。

JSON 中一个常见惯用法是将对象作为其他对象的值来指定,在 JSON-LD 中称为对象的 嵌入;例如,将朋友作为 Person 的对象值来指定:

关于这些关系的更多详细信息,请参见 § 4.5 嵌入

索引值

JSON 中另一种常见惯用法是使用中间对象通过索引来表示属性值。JSON-LD 允许以多种不同方式对数据进行索引,详见 § 4.6 索引值

反向属性

JSON-LD 序列化有向的 。这意味着每个 属性 都指向从一个 节点 到另一个 节点 的关系。然而在某些情况下,需要以相反的方向进行序列化,详见 § 4.8 反向属性

下面的各节将更详细地描述这些高级功能。

4.1 高级上下文用法

本节为非规范性内容。

§ 3.1 The Context 节介绍了 JSON-LD 工作的基本要素。本节在 上下文 的基本原理上进行扩展,并示范如何使用 JSON-LD 实现更高级的用例。

一般来说,只要定义了一个 map 就可以使用上下文。唯一不能表达上下文的情况是将其作为另一个上下文定义的直接子项(但可作为 扩展术语定义 的一部分)。例如,JSON-LD 文档 可以采用由一个或多个 node objects 组成的 数组 形式,并在每个顶级 node object 中使用上下文定义:

外层数组是 展开文档形式展平文档形式 中文档的常见结构,当描述一个不连通的图(节点可能彼此不引用)时是必要的。在此类情况下,使用带有 @graph 属性的顶层 map 可以避免重复编写 @context。详见 § 4.5 嵌入

重复的上下文 术语 使用“最近定义的优先”机制覆盖先前定义。

在上例中,name 这个 术语 在更深层的 details 结构中被覆盖,后者使用了它自己的 嵌入式上下文。注意这通常不是良好的编辑实践,通常仅在与依赖于特定 map 结构的遗留应用一起工作时使用。如果在上下文中重新定义了某个 术语,则与先前定义相关的所有规则都会被移除。如果将某个 术语 重新定义为 null,则该术语将从 活动上下文 中定义的术语列表中有效地移除。

可以通过使用一个 数组 来组合多个上下文,数组按顺序处理。特定 map 中定义的一组上下文被称为 本地上下文活动上下文 指的是在文档中某一点处处于作用域内的 本地上下文 的累积。将 本地上下文 设置为 null 会将 活动上下文 有效地重置为空上下文(没有 术语定义默认语言 或先前上下文中定义的其他内容)。下例指定了一个外部上下文,然后在该外部上下文之上叠加了一个 嵌入式上下文

在 JSON-LD 1.1 中,引入上下文的机制还有其他方式,包括 scoped contexts(范围上下文)和 imported contexts(导入上下文),并且有新的方法来保护术语定义,因此并非总是最后定义的内联上下文决定术语的作用域。请参见 § 4.1.8 范围上下文§ 4.1.9 上下文传播§ 4.1.10 导入上下文 以及 § 4.1.11 受保护的术语定义 以获取更多信息。

在可能的情况下,应将 上下文 定义放在 JSON-LD 文档的顶部。这样可以使文档更易读,并可能使流式解析器更高效。未将 上下文 放在顶部的文档仍然是符合规范的 JSON-LD。

为避免向前兼容问题,应该避免使用以字符 @ 开头且随后完全由一个或多个 ALPHA 字符组成术语,因为它们可能在未来的 JSON-LD 版本中被用作 关键字。以 @ 开头但不是 JSON-LD 1.1 关键字 的术语将被当作其他术语处理,即除非映射到一个 IRI,否则会被忽略。此外,不允许使用空的 术语""),因为并非所有编程语言都能正确处理空的 JSON 键。

4.1.1 JSON-LD 1.1 处理模式

本节为非规范性内容。

JSON-LD 1.1 中定义的新特性可用,除非通过 API 选项将 processing mode 设置为 json-ld-1.0。可以通过 API 选项设置该值。也可以在 context 中使用 @version 条目将 processing mode 显式设置为 json-ld-1.1(将 @version 的值设为数值 1.1),或者也可通过 API 选项设置。显式将 processing mode 设为 json-ld-1.1 可以防止 JSON-LD 1.0 的处理器错误地处理 JSON-LD 1.1 文档。

Example 23: 在上下文中设置 @version
{
  "@context": {
    "@version": 1.1,
    ...
  },
  ...
}

处理文档时遇到的第一个包含 @versioncontext 决定了 processing mode,除非通过 API 选项显式定义了处理模式。这意味着如果在处理了一个没有 @version 的上下文之后遇到 "@version": 1.1,则将把该值解释为已在该上下文中定义了 "@version": 1.1

显式将 processing mode 设为 json-ld-1.1RECOMMENDED 的,旨在防止 JSON-LD 1.0 处理器错误地处理 JSON-LD 1.1 文档并产生不同的结果。

4.1.2 默认词汇

本节为非规范性内容。

有时,所有属性和类型都来自相同的词汇。JSON-LD 的 @vocab 关键字允许作者设置一个通用前缀,作为 vocabulary mapping,用于那些既不匹配某个 term、也既不是 IRI 也不是 compact IRI(即不包含冒号)的所有属性和类型。

如果使用了 @vocab,但某些 map 中的键不应使用该词汇进行扩展,则可以在 context 中将相应的 term 明确设置为 null。例如,下例中将导致 databaseId 条目不会扩展为 IRI,从而在展开时被丢弃。

自 JSON-LD 1.1 起,local context 中的 vocabulary mapping 可以设置为 相对 IRI 引用,该相对引用会与 active context 中的任何 vocabulary mapping 进行连接(如果 active context 中没有 vocabulary mapping,则参考 § 4.1.4 使用文档基准作为默认词汇 了解没有 active context 中 vocabulary mapping 时的处理方式)。

下例演示了使用一个相对于先前默认词汇的相对 IRI 来展开属性的影响,结果见“Expanded (Result)”标签页。

§ 9.15 Context Definitions 中定义的 @vocab 语法允许其值为一个 termcompact IRI。注意,当在 @vocab 的值中使用 term 时,该 term 必须在引入该上下文时已处于作用域内,否则会在同一上下文中造成 @vocab 与其他术语之间的循环依赖。

4.1.3 基准 IRI

本节为非规范性内容。

JSON-LD 允许以相对形式指定 IRIs,这些相对引用根据 [RFC3986] 的 section 5.1 Establishing a Base URI 的规则相对于文档基准解析。可以使用上下文中的 @base 关键字显式设置文档的 base IRI

例如,如果 JSON-LD 文档是从 http://example.com/document.jsonld 检索到的,相对 IRI 引用 将相对于该 IRI 解析:

Example 27: 将相对 IRI 引用用作节点标识符
{
  "@context": {
    "label": "http://www.w3.org/2000/01/rdf-schema#label"
  },
  "@id": "",
  "label": "Just a simple document"
}

该文档使用了空的 @id,它会解析为文档基准。但是如果文档被移动到另一个位置,IRI 将会改变。为防止这种变化(而无需在内容中使用不可变的 IRI),可以在 context 中定义 @base 映射,以覆盖文档的 base IRI

@base 设置为 null 将阻止 相对 IRI 引用 被扩展为绝对 IRI

请注意,如果在外部上下文中使用 @base,该设置将被忽略。

4.1.4 使用文档基准作为默认词汇

本节为非规范性内容。

在某些情况下,词汇术语直接在文档内部定义,而不是在外部词汇中。自 JSON-LD 1.1 起,local context 中的 vocabulary mapping 可以设置为 相对 IRI 引用,当作用域内没有 vocabulary mapping 时,该相对引用会相对于 base IRI 解析。这会导致相对于词汇展开的术语(例如 node objects 的键)基于文档的 base IRI 来创建最终的 IRIs

Example 29: 将 "#" 用作词汇映射
{
  "@context": {
    "@version": 1.1,
    "@base": "http://example/document",
    "@vocab": "#"
  },
  "@id": "http://example.org/places#BrewEats",
  "@type": "Restaurant",
  "name": "Brew Eats"
  ...
}

若该文档位于 http://example/document,则其展开结果如下:

4.1.5 Compact IRIs

本节为非规范性内容。

compact IRI 是一种使用以冒号(:)分隔的 prefixsuffix 来表示 IRI 的方法。prefix 是从 active context 中取出的一个 term,用以在 JSON-LD 文档中标识特定的 IRI 的短字符串。例如,前缀 foaf 可用作 Friend-of-a-Friend 词汇的简写,该词汇在文档中以 IRI http://xmlns.com/foaf/0.1/ 标识。开发者可以将 FOAF 词汇中的任一术语附加到该前缀后面,从而为该词汇术语指定一个 IRI 的简写形式。例如,foaf:name 会被展开为 IRI http://xmlns.com/foaf/0.1/name

在上例中,foaf:name 被展开为 IRI http://xmlns.com/foaf/0.1/name,而 foaf:Person 被展开为 http://xmlns.com/foaf/0.1/Person

Prefixes 会在值的形式为表示为 prefix:suffix 组合的 compact IRI、且 prefixactive context 中定义的某个 term 匹配、且 suffix 不以两个斜线(//)开始时被展开。compact IRI 的展开方式是将映射到 prefixIRI 与(可能为空的)suffix 连接。如果 prefix 未在 active context 中定义,或 suffix 以两个斜线开始(例如 http://example.com),则该值会被解释为 IRI。若前缀为下划线(_),则该值被解释为 blank node identifier

也可以在上下文中使用 compact IRIs,如下例所示:

在明确以兼容 processing mode 的方式操作以保持对 JSON-LD 1.0 的兼容性时,只有在使用简单术语定义且其值以 URI 的 gen-delim 字符(例如 /# 等)结尾时,术语才可能在紧凑化时被选作 compact IRI 的前缀。

在 JSON-LD 1.1 中,只有在以下情形之一时,术语才可能被选为 紧凑 IRI 前缀以用于展开或压缩:使用了一个 简单术语定义 且该定义的值以 URI 的生成分隔符(gen-delim)字符结尾,或者其 扩展术语定义 包含一个值为 true@prefix 条目。如果 简单术语定义 并非以 URI 的生成分隔符(gen-delim)字符结尾,或者 扩展术语定义 包含一个值为 false@prefix 条目,则该术语既不会用于展开 紧凑 IRI,也不会用于将 IRI 压缩为 紧凑 IRI

针对 JSON-LD 1.0 处理器的术语选择行为因对 JSON-LD 1.0 的勘误而发生了变化(详见 此处)。这不会影响现有 JSON-LD 文档的处理行为,但在使用 Compact IRIs 紧凑化文档时会产生细微差别。

紧凑化时的行为可以通过考虑下述展开形式的输入文档来说明:

Example 33: Expanded document used to illustrate compact IRI creation
[{
  "http://example.com/vocab/property": [{"@value": "property"}],
  "http://example.com/vocab/propertyOne": [{"@value": "propertyOne"}]
}]

在 1.0 processing mode 下使用以下上下文时,将会选择术语 vocab 而不是 property,即使与 property 关联的 IRI 更贴近原始 IRI。

Example 34: Compact IRI generation context (1.0)
{
  "@context": {
    "vocab": "http://example.com/vocab/",
    "property": "http://example.com/vocab/property"
  }
}

使用上面的上下文对前述展开的输入文档进行紧凑化将产生如下紧凑化结果:

在原始的 [JSON-LD10] 中,术语选择算法会选择 property,从而创建 compact IRI property:One。可以通过使用 @prefix 将原始行为显式化:

Example 36: Compact IRI generation context (1.1)
{
  "@context": {
    "@version": 1.1,
    "vocab": "http://example.com/vocab/",
    "property": {
      "@id": "http://example.com/vocab/property",
      "@prefix": true
    }
  }
}

在此情形下,property 术语通常不可作为前缀使用,原因在于它以扩展术语定义的形式定义且其 @id 并未以 gen-delim 字符结尾。添加 "@prefix": true 则允许它被用作 compact IRI 的前缀部分,例如 property:One

4.1.6 关键词别名

本节为非规范性内容。

JSON-LD 中的每个 关键词(除 @context 外)都可以被别名为应用特定的关键字。该特性允许通过重用遗留文档中已经存在的 JSON 键来使遗留 JSON 内容被 JSON-LD 利用。该特性也允许开发者仅通过 JSON-LD 的 上下文 设计面向领域的实现。

在上例中,@id@type 这两个 关键词 已被分别别名为 urla

除了用于 @type 的情况外,当术语是一个 关键词 时,用于其扩展术语定义的属性会导致错误。除非 processing mode 被设置为 json-ld-1.0,否则对于 @type 也有例外;有关更多细节和用法示例,请参见 § 4.3.3 @type 上使用 @set

除非将 processing mode 设置为 json-ld-1.0,否则关键词的别名要么是 简单术语定义(其值为一个关键词),要么是带有 @id 条目且可选地带有 @protected 条目的 扩展术语定义;不允许有其他条目。对于 @type 的别名也有上文所述的例外。有关使用 @protected 的详细信息,请参见 § 4.1.11 受保护术语定义

由于关键词不能被重新定义,因此也不能将它们别名为其他关键词。

别名的关键词不得在其所处的 context 内被使用。

有关所有关键词的规范性定义,请参见 § 9.16 关键词

4.1.7 IRI 在上下文内的展开

本节为非规范性内容。

一般来说,在期望出现 IRI 的任何地方都适用常规的 IRI 展开规则(参见 § 3.2 IRIs)。在 context 定义内,这意味着在该上下文中定义的术语在没有循环依赖的情况下也可以在该上下文内使用。例如,在定义 类型化值 时常见地使用 xsd 命名空间:

示例 39: 在上下文内展开 IRI
{
  "@context": {
    "xsd": "http://www.w3.org/2001/XMLSchema#",
    "name": "http://xmlns.com/foaf/0.1/name",
    "age": {
      "@id": "http://xmlns.com/foaf/0.1/age",
      "@type": "xsd:integer"
    },
    "homepage": {
      "@id": "http://xmlns.com/foaf/0.1/homepage",
      "@type": "@id"
    }
  },
  ...
}

在此示例中,xsd 术语被定义并作为 @type 强制(coercion)的前缀用于 age 属性。

术语 也可以在定义另一个术语的 IRI 时被使用:

示例 40: 在上下文内使用术语定义另一个术语的 IRI
{
  "@context": {
    "foaf": "http://xmlns.com/foaf/0.1/",
    "xsd": "http://www.w3.org/2001/XMLSchema#",
    "name": "foaf:name",
    "age": {
      "@id": "foaf:age",
      "@type": "xsd:integer"
    },
    "homepage": {
      "@id": "foaf:homepage",
      "@type": "@id"
    }
  },
  ...
}

Compact IRIsIRIs 可以用在术语定义的左侧。

示例 41: 使用 compact IRI 作为术语
{
  "@context": {
    "foaf": "http://xmlns.com/foaf/0.1/",
    "xsd": "http://www.w3.org/2001/XMLSchema#",
    "name": "foaf:name",
    "foaf:age": {
      "@id": "http://xmlns.com/foaf/0.1/age",
      "@type": "xsd:integer"
    },
    "foaf:homepage": {
      "@type": "@id"
    }
  },
  ...
}

在此示例中,compact IRI 形式有两种不同的用法。第一种用法中,foaf:age 声明了该术语的 IRI(使用短形式)以及与该术语关联的 @type。第二种用法中,仅指定了与该术语关联的 @typefoaf:homepage 的完整 IRI 通过在上下文中查找 foaf 前缀来确定。

警告

如果将 compact IRI 用作术语,则它在展开时必须与单独展开该 compact IRI 时得到的值相同。该点相较于原始 1.0 算法有所更改,以防止术语展开为不同的 IRI,从而导致意外结果。

示例 42: 将 compact IRI 非法别名为不同 IRI
{
  "@context": {
    "foaf": "http://xmlns.com/foaf/0.1/",
    "xsd": "http://www.w3.org/2001/XMLSchema#",
    "name": "foaf:name",
    "foaf:age": {
      "@id": "http://xmlns.com/foaf/0.1/age",
      "@type": "xsd:integer"
    },
    "foaf:homepage": {
     "@id": "http://schema.org/url",
     "@type": "@id"
    }
  },
  ...
}

IRI 也可以在 context 的键位置使用:

示例 43: 将上下文定义与 IRIs 关联
{
  "@context": {
    "foaf": "http://xmlns.com/foaf/0.1/",
    "xsd": "http://www.w3.org/2001/XMLSchema#",
    "name": "foaf:name",
    "foaf:age": {
      "@id": "http://xmlns.com/foaf/0.1/age",
      "@type": "xsd:integer"
    },
    "http://xmlns.com/foaf/0.1/homepage": {
      "@type": "@id"
    }
  },
  ...
}

为了使上例中的 IRI 匹配,必须在 JSON-LD 文档中使用该 IRI。还要注意,foaf:homepage 不会使用 { "@type": "@id" } 声明,因为 foaf:homepagehttp://xmlns.com/foaf/0.1/homepage 并不相同。也就是说,术语在上下文中是通过直接字符串比较进行查找的,优先于前缀查找机制。

警告

既不是 IRI 引用也不是 compact IRI 可以展开为某个不相关的 IRI。这是对原始 1.0 算法的变更,原算法允许但不鼓励此行为。

在上下文中使用术语的另一个唯一例外是禁止循环定义。也就是说,如果 term2 依赖于 term1,则 term1 的定义不能再依赖于 term2。例如,下面的上下文定义就是非法的:

示例 44: 上下文内术语的非法循环定义
{
  "@context": {
    "term1": "term2:foo",
    "term2": "term1:bar"
  },
  ...
}

4.1.8 作用域上下文(Scoped Contexts)

本节为非规范性内容。

一个 扩展术语定义 可以包含一个 @context 属性,该属性为使用该术语定义的属性的值定义一个 上下文(称为 作用域上下文)。当用于一个 属性 时,这被称为 属性作用域上下文。这允许值使用与包含它们的 节点对象 不同的术语定义、基准 IRI、词汇映射或默认语言,就好像该上下文被直接在值本身中指定一样。

在此情形中,社交资料使用 schema.org 词汇定义,而 interest 则从 FOAF 导入,用于定义 Manu 的某个兴趣的节点,这些属性现在来自 FOAF 词汇。

展开该文档时,会结合外部上下文中定义的术语与特定术语在 属性作用域上下文 中专门定义的术语。

也可以使用作为 @type 值的术语来执行作用域划分:

@type 上进行作用域划分在常用属性用于关联不同类型实体且不同实体使用不同词汇的情况下非常有用。例如,hasPart/partOf 可能在文档中作为常见术语使用,但在不同上下文中含义不同。类型作用域上下文 仅对其被用到的 节点对象 生效;在遍历到另一个节点对象时,之前处于作用域内的上下文会恢复生效。如在 § 4.1.9 上下文传播 所述,可以使用 @propagate 关键字来控制此行为。

在节点对象中引入的任何 属性作用域上下文 或本地 上下文 在遍历到另一个节点对象时仍然会生效。

在展开时,会对 @type 的每个值进行考虑(按字典序排列),如果该值也是 活动上下文 中的一个术语并且具有自己的 类型作用域上下文,则该作用域上下文会被应用到活动上下文中。

@type 的值是无序的,因此如果列出了多个类型,则应用 类型作用域上下文 的顺序基于字典序。

例如,考虑下面语义等价的示例。第一个示例展示了属性和类型如何定义它们自己的作用域上下文,这些上下文在展开时被包括在内。

示例 47: 使用嵌入和作用域上下文的展开
{
  "@context": {
    "@version": 1.1,
    "@vocab": "http://example.com/vocab/",
    "property": {
      "@id": "http://example.com/vocab/property",
      "@context": {
        "term1": "http://example.com/vocab/term1"
         ↑ 为 "property" 定义的作用域上下文定义了 term1
      }
    },
    "Type1": {
      "@id": "http://example.com/vocab/Type1",
      "@context": {
        "term3": "http://example.com/vocab/term3"
         ↑ 为 "Type1" 定义的作用域上下文定义了 term3
      }
    },
    "Type2": {
      "@id": "http://example.com/vocab/Type2",
      "@context": {
        "term4": "http://example.com/vocab/term4"
         ↑ 为 "Type2" 定义的作用域上下文定义了 term4
      }
    }
  },
  "property": {
    "@context": {
      "term2": "http://example.com/vocab/term2"
         ↑ 嵌入的上下文定义了 term2
    },
    "@type": ["Type2", "Type1"],
    "term1": "a",
    "term2": "b",
    "term3": "c",
    "term4": "d"
  }
}

上下文的处理顺序取决于它们的定义方式。属性作用域上下文 会首先被处理,随后是任何 嵌入上下文,最后是以适当顺序的 类型作用域上下文。上面的示例在逻辑上等同于下面的示例:

示例 48: 使用嵌入和作用域上下文的展开(嵌入等价)
{
  "@context": {
    "@vocab": "http://example.com/vocab/",
    "property": "http://example.com/vocab/property",
    "Type1": "http://example.com/vocab/Type1",
    "Type2": "http://example.com/vocab/Type2"
  },
  "property": {
    "@context": [{
        "term1": "http://example.com/vocab/term1"
         ↑ 先前为 "property" 定义的作用域上下文定义了 term1
      }, {
        "term2": "http://example.com/vocab/term2"
         ↑ 嵌入的上下文定义了 term2
      }, {
        "term3": "http://example.com/vocab/term3"
         ↑ 先前为 "Type1" 定义的作用域上下文定义了 term3
      }, {
      "term4": "http://example.com/vocab/term4"
         ↑ 先前为 "Type2" 定义的作用域上下文定义了 term4
    }],
    "@type": ["Type2", "Type1"],
    "term1": "a",
    "term2": "b",
    "term3": "c",
    "term4": "d"
  }
}

如果某个 术语 定义了一个 作用域上下文,随后该术语被重新定义,则早先扩展术语定义中定义的上下文关联会在该重新定义的作用域内丢失。这与术语定义覆盖先前较浅层定义的行为一致,详见 § 4.1 高级上下文用法

作用域上下文 是 JSON-LD 1.1 的新特性。

4.1.9 上下文传播

本节为非规范性内容。

一旦引入,上下文 将持续生效,直到后续的上下文 通过将 @context 设为 null 或通过重新定义术语来移除它,除了 类型作用域上下文 的例外情形外 —— 类型作用域上下文会将该上下文的影响限制到下一个进入的 节点对象 为止。可以使用 @propagate 关键字来改变此行为。

下面的示例演示了当在上下文中将 @propagate 设置为 false 时,向下进入新的 节点对象 时,该上下文中定义的术语会如何在效果上被移除。

包含在数组中的上下文必须对 @propagate 使用相同的值,这是由于 JSON-LD 1.1 处理算法与 API 中对回滚行为的定义方式所致。

4.1.10 导入上下文

本节为非规范性内容。

JSON-LD 1.0 包含用于修改正在生效的 上下文 的机制。这包括能够加载并处理远程的上下文,然后通过新的上下文对其应用进一步更改的能力。

然而,随着 JSON-LD 1.1 的引入,也希望能够加载远程的 上下文(尤其是现有的 JSON-LD 1.0 上下文),并在处理之前对其应用 JSON-LD 1.1 的特性。

通过在 上下文 中使用 @import 关键字,可以加载并在处理前修改另一个远程的上下文(称为被导入的上下文)。这些修改在包含 @import 的上下文(称为包装上下文)中表达。一旦加载了被导入的上下文,包装上下文的内容将在处理前合并到被导入的上下文中。合并操作将导致包装上下文中的每个键值对被添加到已加载的被导入上下文中,且包装上下文的键值对优先。

通过使现有的上下文 能够在处理前被重用并内联编辑,可以应用上下文范围的关键字来调整被导入上下文中的所有术语定义。同样,也可以在处理前替换术语定义,从而进行诸如确保术语定义与先前受保护的术语匹配或包含额外类型强制信息等调整。

下面的示例展示了如何使用 @import 来表达一个 类型作用域上下文,该上下文加载一个被导入的上下文并将 @propagate 设置为 true,作为进行类似修改的一种技术。

假设存在一个可以通过 URL https://json-ld.org/contexts/remote-context.jsonld 远程引用的上下文

示例 50: 将被导入的远程上下文
{
  "@context": {
    "Type1": "http://example.com/vocab/Type1",
    "Type2": "http://example.com/vocab/Type2",
    "term1": "http://example.com/vocab#term1",
    "term2": "http://example.com/vocab#term2",
    ...
  }
}

可以使用一个包装的 上下文 来获取并修改它:

示例 51: 在类型作用域上下文中获取上下文并设置为传播
{
  "@context": {
    "@version": 1.1,
    "MyType": {
      "@id": "http://example.com/vocab#MyType",
      "@context": {
        "@version": 1.1,
        "@import": "https://json-ld.org/contexts/remote-context.jsonld",
        "@propagate": true
      }
    }
  }
}

其效果相当于将整个被导入的 上下文 复制到该 类型作用域上下文 中:

示例 52: 在类型作用域上下文中获取上下文并设置为传播的结果
{
  "@context": {
    "@version": 1.1,
    "MyType": {
      "@id": "http://example.com/vocab#MyType",
      "@context": {
        "@version": 1.1,
        "Type1": "http://example.com/vocab/Type1",
        "Type2": "http://example.com/vocab/Type2",
        "term1": "http://example.com/vocab#term1",
        "term2": "http://example.com/vocab#term2",
        ...
        "@propagate": true
      }
    }
  }
}

同样,包装的 上下文 可以替换术语定义或设置其他可能影响被导入上下文术语定义处理方式的上下文范围关键字:

示例 53: 获取上下文以修改 @vocab 和术语定义
{
  "@context": {
    "@version": 1.1,
    "@import": "https://json-ld.org/contexts/remote-context.jsonld",
    "@vocab": "http://example.org/vocab#",
     ↑ This will replace any previous @vocab definition prior to processing it
    "term1": {
      "@id": "http://example.org/vocab#term1",
      "@type": "http://www.w3.org/2001/XMLSchema#integer"
    }
     ↑ This will replace the old term1 definition prior to processing it
  }
}

同样,效果相当于将整个被导入的 上下文 复制到该 上下文 中:

示例 54: 获取上下文以修改 @vocab 和术语定义的结果
{
  "@context": {
    "@version": 1.1,
    "Type1": "http://example.com/vocab/Type1",
    "Type2": "http://example.com/vocab/Type2",
    "term1": {
      "@id": "http://example.org/vocab#term1",
      "@type": "http://www.w3.org/2001/XMLSchema#integer"
    },
     ↑ Note term1 has been replaced prior to processing
    "term2": "http://example.com/vocab#term2",
    ...,
    "@vocab": "http://example.org/vocab#"
  }
}

加载被导入的上下文 的结果必须是一个上下文定义,而不是一个 IRI 或一个 数组。此外,被导入的上下文不能包含 @import 条目。

4.1.11 受保护的术语定义

本节为非规范性内容。

JSON-LD 被用于许多规范中作为指定的数据格式。然而,人们也希望允许某些 JSON-LD 内容作为纯 JSON 进行处理,而不使用任何 JSON-LD 算法。由于 JSON-LD 非常灵活,原始格式中的某些术语可能会通过使用嵌入式上下文 在本地被重写,从而对基于 JSON-LD 的实现产生不同含义。另一方面,“纯 JSON” 实现可能无法解释这些嵌入式上下文,因此仍会用原始含义来解释这些术语。为防止这种解释上的分歧,JSON-LD 1.1 允许将术语定义设置为 受保护

受保护术语定义(protected term definition)是指带有 @protected 条目且其值为 true 的术语定义。它通常会防止后续上下文覆盖该术语定义(无论是通过对相同术语的新定义,还是通过使用 "@context": null 清除上下文)。此类尝试将引发错误并中止处理(在下面描述的某些特定情形中除外)。

示例 55: 受保护的术语定义通常不能被覆盖
{
  "@context": [
    {
      "@version": 1.1,
      "Person": "http://xmlns.com/foaf/0.1/Person",
      "knows": "http://xmlns.com/foaf/0.1/knows",
      "name": {
        "@id": "http://xmlns.com/foaf/0.1/name",
        "@protected": true
      }
    },
    {
      – this attempt will fail with an error
      "name": "http://schema.org/name"
    }
  ],
  "@type": "Person",
  "name": "Manu Sporny",
  "knows": {
    "@context": [
      – this attempt would also fail with an error
      null,
      "http://schema.org/"
    ],
    "name": "Gregg Kellogg"
  }
}

当需要保护上下文中的大部分或全部术语定义时,可以在上下文本身添加一个 @protected 条目并将其设为 true。其效果等同于逐个保护其术语定义。可以通过在某些术语定义中添加 @protected 条目并将其设为 false 来为例外情况解除保护。

虽然受保护的术语通常不能被覆盖,但对此规则有两个例外。 第一个例外是:如果新的定义与受保护的术语定义在语义上完全相同(忽略 @protected 标志),则允许上下文重新定义该受保护术语。其理由是新的定义并未改变受保护术语的语义,因此并不违反保护规则。这在广泛使用的术语定义(例如将 @type 别名为 type)中尤其有用,这类定义可能出现在多个上下文中(包括受保护的形式)。

第二个例外是,属性作用域上下文 不受保护的影响,因此可以覆盖受保护的术语(无论是通过新的术语定义,还是通过使用 "@context": null 清除上下文)。

其理由在于,“纯 JSON” 实现依赖于给定规范,只会遍历该规范中定义的属性。属于这些规范所定义属性的 作用域上下文 是规范的一部分,因此“纯 JSON” 实现应当能够意识到它们引入的语义变化。属于其他属性的 作用域上下文 应用于“纯 JSON” 实现会忽略的文档部分。在这两种情况下,JSON-LD 感知的实现与“纯 JSON” 实现之间不会产生解释分歧,因此允许覆盖。

通过阻止术语被覆盖,保护也会阻止对术语进行任何调整(例如,定义更精确的数据类型、将术语的使用限制为列表等)。这类调整在一些通用上下文中很常见,因此保护可能会阻碍其可用性。因此,上下文发布者应谨慎使用此功能。

受保护的术语定义是 JSON-LD 1.1 中的新特性。

4.2 描述值

本节为非规范性内容。

值是图中与标量值(例如字符串、日期、时间等原子值)相关联的叶节点。

4.2.1 有类型的值

本节为非规范性内容。

带有关联类型的值,也称为有类型值,通过将值与表示该值类型的IRI 关联来指示。JSON-LD 中可以用三种方式表示有类型的值:

  1. @context 部分为某个term 定义时使用 @type 关键字
  2. 使用值对象
  3. 使用原生 JSON 类型,例如数字(number)、truefalse

第一个示例使用 @type 关键字在 @context 中将类型与特定的term 关联:

上例中由于在 @context 中的说明,modified 键的值会被自动解释为 dateTime 类型。示例标签展示了 JSON-LD 处理器如何解释这些数据。

第二个示例在 JSON-LD 文档主体中以展开形式设置类型信息:

上面两个例子都会产生值 2010-05-29T14:17:39+02:00,类型为 http://www.w3.org/2001/XMLSchema#dateTime。注意也可以使用termcompact IRI 来表示类型的值。

@type 关键字 也用于将类型与节点 关联。节点类型值类型 是不同的概念。有关如何向节点添加类型的更多信息,请参见 § 3.5 指定类型

在展开时,若在术语定义内定义了 @type,则可以将其与字符串值关联以创建展开的值对象(详见 § 4.2.3 类型强制)。类型强制仅适用于字符串值,不适用于已经是映射(例如展开形式的节点对象或值对象)的值。

节点类型 指明正在描述的实体类型,例如人、地点、事件或网页。值类型 指明特定值的数据类型,例如整数、浮点数或日期。

Example 61: 演示 @type 上下文敏感性的示例
{
  ...
  "@id": "http://example.org/posts#TripToWestVirginia",
  "@type": "http://schema.org/BlogPosting",  ← 这是节点类型
  "http://purl.org/dc/terms/modified": {
    "@value": "2010-05-29T14:17:39+02:00",
    "@type": "http://www.w3.org/2001/XMLSchema#dateTime"  ← 这是值类型
  }
  ...
}

第一次使用 @type 是将一个 节点类型http://schema.org/BlogPosting)与该节点 关联,使用了 @id 关键字来表达。第二次使用 @type 是将一个 值类型http://www.w3.org/2001/XMLSchema#dateTime)与使用 @value 关键字表示的值进行关联。一般规则是:当 @value@type 在同一个映射中使用时,@type 表示值类型;否则 @type 表示节点类型。上例表达了下列数据:

4.2.2 JSON 文本字面量

本节为非规范性内容。

有时把原生 JSON 包含在 JSON-LD 中且不将其解释为 JSON-LD 是有用的。通常,JSON-LD 处理器会忽略那些不映射到IRIs的属性,但这会导致在执行各种算法变换时这些数据被排除。但是,当要描述的数据本身就是 JSON 时,确保它在算法变换后仍然保留是很重要的。

警告

JSON-LD 的设计是允许通过使用 上下文 来解释原生 JSON。使用JSON 文本字面量 会生成不可进一步解释的数据块,仅在无法将 JSON 表示为 JSON-LD 的罕见情形下使用。

当某个术语在定义时将 @type 设为 @json,JSON-LD 处理器会将该值视为JSON 文本字面量,而不是将其进一步解释为 JSON-LD。在展开文档形式中,这类 JSON 会成为具有 "@type": "@json"值对象@value 的值。

转换为 RDF 时,JSON 文本字面量将基于 JSON 的特定序列化形式具有词法表示,详见 [JSON-LD11-API] 的 Compaction algorithm 和 JSON 数据类型 的描述。

下面示例显示了作为属性值包含的JSON 文本字面量。注意 RDF 结果使用了 JSON 的规范化形式以确保不同处理器之间的互操作性。JSON 规范化在 [JSON-LD11-API] 的 Data Round Tripping 部分中有描述。

通常,当 JSON-LD 处理器遇到 null 时,相关的条目或值会被移除。然而,null 是有效的 JSON 标记;当它作为JSON 文本字面量的值时,该 null 值将会被保留。

4.2.3 类型强制(Type Coercion)

本节为非规范性内容。

JSON-LD 支持将字符串值强制(coerce)为特定数据类型。类型强制允许在部署 JSON-LD 时使用字符串属性值,并通过在展开的值对象表示中将值与类型的IRI 关联,从而将这些字符串解释为有类型值。使用类型强制,可以在不必对每条数据都显式指定数据类型的情况下使用字符串表示。

类型强制在扩展术语定义中通过 @type 键来指定。该键的值会展开为一个IRI。或者,也可以使用关键字 @id@vocab 作为值来指示,在 JSON-LD 文档主体中某个术语的字符串值被强制为 @id@vocab 时应将其解释为IRI@vocab@id 的区别在于其展开 IRI 的方式:当使用 @vocab 时,会先尝试将值作为术语进行展开;若在活动上下文中没有匹配的术语,则在值中包含冒号时尝试将其展开为 IRI 或 compact IRI,否则使用活动上下文的词汇映射来展开(如有)。而强制为 @id 的值若包含冒号则按 IRI 或 compact IRI 展开;否则将其解释为相对于文档的相对 IRI 引用。

使用术语定义对值进行强制与在节点对象上设置一个或多个类型是不同的:前者不会向图中添加新数据,而后者通过添加额外关系来管理节点类型。

@type 键的值中使用的术语或 compact IRI 可以在同一上下文中定义。这意味着可以在上下文中指定如 xsd 的术语,然后在同一上下文定义中使用 xsd:integer

下例演示了 JSON-LD 作者如何将值强制为有类型值IRIs

需要注意的是,术语 仅在展开时用于词汇相对的位置,例如键和值的地图条目。@id 的值被视为相对于文档的,并不使用术语定义来展开。例如,考虑下列情况:

意外的结果是 "barney" 在不同位置被展开为 http://example1.com/barneyhttp://example2.com/barney。根据关联的术语定义,作为 IRI 解释的字符串值通常被视为相对于文档。在某些情况下,将其解释为相对于词汇(通过在术语定义中使用 "@type": "@vocab" 指定)是合理的,但这可能导致如上所示的意外后果。

在前例中,"barney" 出现两次:一次作为 @id 的值(始终解释为相对于文档的 IRI),另一次作为被定义为词汇相对的 "fred" 的值,因此得到不同的展开值。

更多内容见 § 4.1.2 默认词汇

使用 "@type": "@id" 代替 @vocab 的变体示例,说明了将 "barney" 相对于文档解释的行为:

三元组 ex1:fred ex2:knows ex1:barney . 虽然被输出两次,但在输出数据集中只存在一次,因为这是重复三元组。

术语也可以使用IRIscompact IRIs 定义。这允许将强制规则应用于那些不是简单term表示的键。例如:

在这种情况下,术语定义中的 @id 定义是可选的。如果存在,该 @id 指定的IRIcompact IRI 将始终被展开为由 @id 键定义的 IRI——无论是否定义了前缀。

类型强制总是使用键的未展开值来执行。在上例中,这意味着类型强制会查找活动上下文中的 foaf:age,而不是对应的已展开 IRI http://xmlns.com/foaf/0.1/age

上下文中的键在展开和值强制时被视为术语。有时,这可能导致同一已展开 IRI 的多种表示。例如,可以指定 dogcat 都展开为 http://example.com/vocab#animal。这样做可能有助于为不同的术语建立不同的类型强制或语言规则。

4.2.4 字符串国际化(String Internationalization)

本节为非规范性内容。

在某些情况下,需要为字符串标注其语言。在 JSON-LD 中有多种方式可以做到这一点。首先,可以在上下文中通过设置 @language 键为 JSON-LD 文档定义一个默认语言

上例会将 ja 语言标签与两个字符串 花澄科学者 相关联。语言标签的定义参见 [BCP47]。默认语言 对所有未被类型强制的字符串值生效。

若要为子树清除默认语言,可在中间上下文(例如作用域上下文)中将 @language 设为 null,如下所示:

Example 69: 清除默认语言
{
  "@context": {
    ...
    "@version": 1.1,
    "@vocab": "http://example.com/",
    "@language": "ja",
    "details": {
      "@context": {
        "@language": null
      }
    }
  },
  "name": "花澄",
  "details": {"occupation": "Ninja"}
}

其次,可以在具体的term上使用扩展术语定义来关联语言:

Example 70: 带语言的展开术语定义
{
  "@context": {
    ...
    "ex": "http://example.com/vocab/",
    "@language": "ja",
    "name": { "@id": "ex:name", "@language": null },
    "occupation": { "@id": "ex:occupation" },
    "occupation_en": { "@id": "ex:occupation", "@language": "en" },
    "occupation_cs": { "@id": "ex:occupation", "@language": "cs" }
  },
  "name": "Yagyū Muneyoshi",
  "occupation": "忍者",
  "occupation_en": "Ninja",
  "occupation_cs": "Nindža",
  ...
}

上例会将 忍者 与默认语言标签 ja 关联,将 Ninjaen 关联,将 Nindžacs 关联。由于在 name 的扩展术语定义中将 @language 重置为 null,因此 name 的值 Yagyū Muneyoshi 不会被关联任何语言标签。

语言关联仅适用于普通字符串(plain strings)。有类型值或受类型强制的值不会被语言标注。

如上所示,系统常常需要以多语言形式表达某属性的值。通常,这类系统也会尽量为开发者提供以编程方式访问语言特定数据的便捷结构。在这类情况下,可以使用语言映射(language maps)

Example 71: 使用语言映射在三种语言中表示属性
{
  "@context": {
    ...
    "occupation": { "@id": "ex:occupation", "@container": "@language" }
  },
  "name": "Yagyū Muneyoshi",
  "occupation": {
    "ja": "忍者",
    "en": "Ninja",
    "cs": "Nindža"
  }
  ...
}

上例与前例表达完全相同的信息,但将所有值合并到单一属性中。对于支持点号表示法访问对象属性的编程语言,开发者可使用 property.language 模式访问特定语言的值(当语言仅限主语言子标签且不依赖其他子标签如 "en-us" 时)。例如,访问英语职业可使用 obj.occupation.en

第三种方式是使用值对象覆盖默认语言:

Example 72: 使用展开值覆盖默认语言
{
  "@context": {
    ...
    "@language": "ja"
  },
  "name": "花澄",
  "occupation": {
    "@value": "Scientist",
    "@language": "en"
  }
}

这使得可以在省略 @language 标签或将其设为 null 时使用普通字符串来表示值,例如:

Example 73: 使用展开值移除语言信息
{
  "@context": {
    ...
    "@language": "ja"
  },
  "name": {
    "@value": "Frank"
  },
  "occupation": {
    "@value": "Ninja",
    "@language": "en"
  },
  "speciality": "手裏剣"
}

有关使用语言映射 设置映射值语言的描述,请参见 § 9.8 语言映射(Language Maps)

4.2.4.1 基准方向(Base Direction)

本节为非规范性内容。

也可以为字符串或带语言标签的字符串 注明其基准方向。与语言类似,可以在上下文中通过设置 @direction 键为 JSON-LD 文档定义一个默认基准方向

上例会将 ar-EG 语言标签和 "rtl" 基准方向与两个字符串 HTML و CSS: تصميم و إنشاء مواقع الويبمكتبة 关联。默认基准方向适用于所有未被类型强制的字符串值。

若要为子树清除默认基准方向,可在中间上下文(如作用域上下文)中将 @direction 设为 null

Example 75: 清除默认基准方向
{
  "@context": {
    ...
    "@version": 1.1,
    "@vocab": "http://example.com/",
    "@language": "ar-EG",
    "@direction": "rtl",
    "details": {
      "@context": {
        "@direction": null
      }
    }
  },
  "title": "HTML و CSS: تصميم و إنشاء مواقع الويب",
  "details": {"genre": "Technical Publication"}
}

其次,可以在具体的term上通过扩展术语定义关联基准方向:

Example 76: 带语言与方向的展开术语定义
{
  "@context": {
    ...
    "@version": 1.1,
    "@language": "ar-EG",
    "@direction": "rtl",
    "ex": "http://example.com/vocab/",
    "publisher": { "@id": "ex:publisher", "@direction": null },
    "title": { "@id": "ex:title" },
    "title_en": { "@id": "ex:title", "@language": "en", "@direction": "ltr" }
  },
  "publisher": "مكتبة",
  "title": "HTML و CSS: تصميم و إنشاء مواقع الويب",
  "title_en": "HTML and CSS: Design and Build Websites",
  ...
}

上例将创建三条属性:

主体 属性 语言 方向
_:b0 http://example.com/vocab/publisher مكتبة ar-EG
_:b0 http://example.com/vocab/title HTML و CSS: تصميم و إنشاء مواقع الويب ar-EG rtl
_:b0 http://example.com/vocab/title HTML and CSS: Design and Build Websites en ltr

基准方向关联仅适用于普通字符串和带语言标签的字符串。有类型值或受类型强制的值不会被赋予基准方向。

第三种方式是使用值对象覆盖默认语言和默认基准方向:

Example 77: 使用展开值覆盖默认语言和默认基准方向
{
  "@context": {
    ...
    "@language": "ar-EG",
    "@direction": "rtl"
  },
  "title": "HTML و CSS: تصميم و إنشاء مواقع الويب",
  "author": {
    "@value": "Jon Duckett",
    "@language": "en",
    "@direction": null
  }
}

有关基准方向的更深入讨论,请参见 Strings on the Web: Language and Direction Metadata [string-meta]。

4.3 值的排序

本节为非规范性内容。

JSON-LD 作者可以通过使用数组以紧凑的方式表示多个值。由于图(graph)不描述节点之间链接的顺序,JSON-LD 中的数组默认并不传达其中元素的顺序。这与常规 JSON 数组正好相反,后者默认是有序的。例如,考虑下面的简单文档:

也可以使用展开形式来表示多个值:

上面示例生成的语句同样没有固有顺序。

尽管某属性的多个值通常属于相同类型,JSON-LD 并不对此加以限制,属性可以具有不同类型的值:

作为语句查看时,这些值没有固有的顺序。

4.3.1 列表

本节为非规范性内容。

由于有序集合在数据建模中相当重要,因此使用特定语言支持是有益的。在 JSON-LD 中,可使用 @list 关键字 表示列表,如下所示:

这描述了该数组的有序用法,并且在处理文档时会维护顺序。如果给定多值属性的每次使用都是列表,则可以在上下文中通过将 @container 设置为 @list 来简写:

RDF 中对列表的实现依赖于使用属性 rdf:firstrdf:rest 将匿名节点连接在一起,列表的结尾由资源 rdf:nil 定义,如“语句”选项卡所示。这样即可在无序的语句集合中表示顺序。

JSON-LD 与 Turtle 都为表示有序列表提供了简写方式。

在 JSON-LD 1.1 中,列表的列表(即某个列表对象的值本身也是一个列表对象)被完全支持。

注意,"@container": "@list" 定义递归地描述了列表的数组值本身也是列表。例如,在《The GeoJSON Format》(参见 RFC7946)中,coordinates 是由两个或更多数字组成的 position 的有序列表,这些 position 表示为数字数组:

Example 83:在 GeoJSON 中表示的坐标
{
  "type": "Feature",
  "bbox": [-10.0, -10.0, 10.0, 10.0],
  "geometry": {
    "type": "Polygon",
    "coordinates": [
        [
            [-10.0, -10.0],
            [10.0, -10.0],
            [10.0, 10.0],
            [-10.0, -10.0]
        ]
    ]
  }
  //...
}

对于这些示例,确保 bboxcoordinates 中表达的值保持其顺序是很重要的,这需要使用嵌套的列表结构。在 JSON-LD 1.1 中,我们可以通过递归列表并添加适当的上下文定义来表达这一点:

注意 coordinates 包含三级列表。

与与 @list 容器关联的术语值总是以数组的形式表示,即使只有一个值或没有值也一样。

4.3.2 集合(Sets)

本节为非规范性内容。

@list 用于描述有序列表时,@set 关键字用于描述无序集合。在 JSON-LD 文档主体中使用 @set 会在处理文档时被优化掉,因为它只是语法糖。然而,在文档的上下文中使用 @set 很有用。与 @list 相似,与 @set 容器关联的术语值始终以数组的形式表示,即使只有一个值(在紧凑形式中本可能被优化为非数组形式)也仍为数组。这使得对 JSON-LD 文档的后处理更容易,因为数据始终以数组形式存在,即便该数组只包含单个值。

这描述了该数组为无序集合,处理文档时其顺序可能会改变。默认情况下,值数组是无序的,但可以在上下文中将 @container 设置为 @set 来显式表示:

自 JSON-LD 1.1 起,@set 关键字可以与展开术语定义中的其他容器规格结合使用,从而使紧凑值的索引在表示时始终使用数组。有关更多讨论,请参见 § 4.6 索引值(Indexed Values)

4.3.3 在与 @type 一起使用 @set

本节为非规范性内容。

除非将 processing mode 设置为 json-ld-1.0,否则可在展开的术语定义中将 @container 设置为 @set 来用于 @type;在此类展开术语定义中,不得设置其他条目。Compaction 算法使用此规则以确保 @type(或其别名)的值始终以数组表示。

Example 87:在 @type 上设置 @container: @set
{
  "@context": {
    "@version": 1.1,
    "@type": {"@container": "@set"}
  },
  "@type": ["http:/example.org/type"]
}

4.4 嵌套属性

本节为非规范性内容。

许多 JSON API 使用中间对象将属性与其实体分离;在 JSON-LD 中这些称为 嵌套属性。例如,一组可能的标签可以在一个共同的属性下分组:

通过使用关键字 @nest 定义 labels,JSON-LD 处理器将在展开时忽略由 labels 属性创建的嵌套,并将其内容视为直接声明在包含对象中。在此情况下,labels 属性在语义上是无意义的。将其定义为等同于 @nest 会导致在展开时忽略它,从而等价于下面的写法:

类似地,术语定义 可以包含一个引用到已别名为 @nest 的术语的 @nest 属性,这将在压缩时导致这些属性被嵌套到该别名术语下。在下面的示例中,main_labelother_label 都被定义为 "@nest": "labels",这会在压缩时使它们序列化到 labels 下。

Example 90: 定义属性嵌套 - 展开输入
[{
  "@id": "http://example.org/myresource",
  "http://xmlns.com/foaf/0.1/homepage": [
    {"@id": "http://example.org"}
  ],
  "http://www.w3.org/2004/02/skos/core#prefLabel": [
    {"@value": "This is the main label for my resource"}
  ],
  "http://www.w3.org/2004/02/skos/core#altLabel": [
    {"@value": "This is the other label"}
  ]
}]
Example 91: 定义属性嵌套 - 上下文
{
  "@context": {
    "@version": 1.1,
    "skos": "http://www.w3.org/2004/02/skos/core#",
    "labels": "@nest",
    "main_label": {"@id": "skos:prefLabel", "@nest": "labels"},
    "other_label": {"@id": "skos:altLabel", "@nest": "labels"},
    "homepage": {"@id": "http://xmlns.com/foaf/0.1/homepage", "@type": "@id"}
  }
}

嵌套属性 是 JSON-LD 1.1 的新特性。

4.5 嵌入

本节为非规范性内容。

嵌入 是 JSON-LD 的一项特性,允许作者将 节点对象 用作属性值(property values)。这是一种常用机制,用于在两个节点之间创建父子关系。

如果不使用嵌入,节点对象 可以通过引用另一个节点对象的标识符来链接。例如:

上例分别描述了 Manu 与 Gregg 两个节点对象,并将 knows 属性定义为将字符串值视为标识符。嵌入 允许将 Gregg 的节点对象作为 knows 属性的值进行 嵌入

像上面所示的那类 节点对象 可以在 JSON-LD 文档主体的任何值位置使用。

虽然在图中标识节点被视为最佳实践,但有时这并不现实。在数据模型中,未显式标识符的节点称为 空白节点,可以通过诸如 JSON-LD 的序列化使用 空白节点标识符 来表示。在前例中,Manu 的顶层节点没有标识符,也不需要在数据模型中有一个来描述它。然而,如果我们想描述 Gregg 到 Manu 的 knows 关系,就需要引入一个空白节点标识符(例如 _:b0)。

空白节点标识符 可能会被诸如 扁平化 等算法自动引入,但它们也对作者在文档中直接描述此类关系十分有用。

4.5.1 标识空白节点

本节为非规范性内容。

有时需要在无法用唯一的 节点IRI 来标识它们时表达信息。这类节点称为 空白节点。JSON-LD 并不要求所有节点都使用 @id 来标识。然而,某些图拓扑可能需要可序列化的标识符。例如,包含环的图不能仅通过 嵌入 来序列化,必须使用 @id 来连接这些节点。在这些情况下,可以使用看起来像以下划线(_)为方案的 IRI 的 空白节点标识符。这允许在文档内局部引用该节点,但无法从外部文档引用它。该空白节点标识符的作用域限于使用它的文档。

上例包含关于两个无法用 IRI 标识的特工的信息。虽然可以不使用空白节点标识符来表达 agent 1 认识 agent 2,但为了让 agent 2 能引用 agent 1,就必须为 agent 1 分配一个标识符。

值得注意的是,空白节点标识符在处理过程中可能会被重新标注。如果开发者发现自己多次引用同一个空白节点,应考虑使用可解引用的 IRI 来命名该节点,以便也能从其他文档中引用它。

4.6 索引值

本节为非规范性内容。

有时需要比遍历多个数组值更直接地访问多个属性值。JSON-LD 提供了一种索引机制,允许使用中间的map将特定索引与其关联的值相关联。

数据索引
§ 4.6.1 数据索引 所述,数据索引允许任意键引用一个节点或值。
语言索引
§ 4.6.2 语言索引 所述,语言索引允许使用语言来引用一个字符串,并将其解释为与该字符串关联的语言。
节点标识符索引
§ 4.6.3 节点标识符索引 所述,节点标识符索引允许一个IRI引用一个节点,并将其解释为该节点的标识符。
节点类型索引
§ 4.6.4 节点类型索引 所述,节点类型索引允许一个IRI引用一个节点,并将其解释为该节点的类型。

有关 JSON-LD 中索引的其他用法,请参见 § 4.9 命名图

4.6.1 数据索引

本节为非规范性内容。

通常使用数据库来提高对数据的访问效率。开发者经常将此类功能扩展到应用数据中以获得类似的性能提升。这些数据从 Linked Data 的角度可能没有语义意义,但对应用仍然有用。

JSON-LD 引入了可以将数据结构化为更高效访问形式的索引映射(index maps)的概念。数据索引功能允许作者使用简单的键-值映射来组织数据,其中键不映射到IRI。这使得可以直接访问数据,而无需在数组中扫描以查找特定项。在 JSON-LD 中,这类数据可以通过在上下文中将 @index 关键字与 @container 声明关联来指定:

在上例中,athletes 术语被标记为一个索引映射catcherpitcher 键在语义上会被忽略,但会在语法上由 JSON-LD 处理器保留。如果在 JavaScript 中使用,这允许开发者使用如下代码直接访问特定运动员:obj.athletes.pitcher

数据的解释如“语句”表所示。注意索引键不会出现在语句中,但如果文档被压缩或展开(参见 § 5.2 压缩文档形式§ 5.1 展开文档形式),这些键在文档的紧凑或展开表示中仍会被保留。

警告

由于数据索引在往返 RDF 时不会被保留;因此应谨慎使用该特性。通常,有其他在 RDF 中能被保留的索引机制更为合适。

@container 的值也可以是包含 @index@set 的数组。在进行压缩时,这可确保 JSON-LD 处理器对所有索引值使用数组形式。

除非将 processing mode 设置为 json-ld-1.0,否则特殊索引 @none 用于对没有关联索引的数据进行索引,这有助于维持规范化表示。

4.6.1.1 基于属性的数据索引

本节为非规范性内容。

在最简单的形式中(如上例),数据索引并不为索引映射的键赋予语义。然而,在某些情况下,用于索引对象的键与这些对象在语义上相关联,应当不仅在语法上保留它们,还应在语义上保留它们。

除非将 processing mode 设置为 json-ld-1.0,在术语描述中使用 "@container": "@index" 时可以同时包含一个 "@index" 键。该键的值必须映射到一个IRI,用于标识将每个对象与其键关联的语义属性。

在使用基于属性的数据索引时,索引映射 只能用于 节点对象,不能用于值对象图对象。值对象仅限于具有某些特定键,不支持任意属性。

4.6.2 语言索引

本节为非规范性内容。

包含多语言字符串值的 JSON 可以使用语言映射(language map)来表示,以便按语言标签对属性值进行索引。这样可以直接访问语言值,而不用在数组中查找特定项。在 JSON-LD 中,这类数据可以通过在上下文中将 @language 关键字与 @container 声明关联来指定:

在上例中,label 术语已被标记为一个语言映射ende 键由 JSON-LD 处理器隐式关联到它们各自的值。这允许开发者使用如下代码访问德语版本的 labelobj.label.de,但这仅当语言限定为主语言子标签且不依赖诸如 "de-at" 之类的其他子标签时才适用。

@container 的值也可以是包含 @language@set 的数组。在进行压缩时,这可确保 JSON-LD 处理器对所有语言标签值使用数组形式。

除非将 processing mode 设置为 json-ld-1.0,否则特殊索引 @none 用于对没有语言的字符串进行索引;这有助于为没有数据类型的字符串值维持规范化的表示。

4.6.3 节点标识符索引

本节为非规范性内容。

除了索引映射之外,JSON-LD 还引入了用于结构化数据的id 映射的概念。id 索引特性允许作者使用简单的键-值映射来组织数据,其中键映射到IRI。这使得可以直接访问关联的节点对象,而无需在数组中查找特定项。在 JSON-LD 中,这类数据可以通过在上下文中将 @id 关键字与 @container 声明关联来指定:

在上例中,post 术语已被标记为一个id 映射http://example.com/posts/1/enhttp://example.com/posts/1/de 键将被解释为节点对象值的 @id 属性。

上面数据的解释与使用 JSON-LD 处理器在 § 4.6.1 数据索引 中的示例完全相同。

@container 的值也可以是包含 @id@set 的数组。在进行压缩时,这可确保 JSON-LD 处理器对所有节点标识符值使用数组形式。

特殊索引 @none 用于对没有 @id节点对象进行索引,这有助于维持规范化表示。@none 索引也可以是展开为 @none 的术语,例如示例中使用的术语 none

Id 映射 是 JSON-LD 1.1 中的新特性。

4.6.4 节点类型索引

本节为非规范性内容。

除了id索引映射之外,JSON-LD 还引入了用于结构化数据的类型映射(type maps)的概念。类型索引特性允许作者使用简单的键-值映射来组织数据,其中键映射到IRI。这使得可以根据特定节点对象@type 来组织数据。在 JSON-LD 中,这类数据可以通过在上下文中将 @type 关键字与 @container 声明关联来指定:

在上例中,affiliation 术语已被标记为一个类型映射schema:Corporationschema:ProfessionalService 键将被解释为节点对象值的 @type 属性。

@container 的值也可以是包含 @type@set 的数组。在进行压缩时,这可确保 JSON-LD 处理器对所有类型值使用数组形式。

特殊索引 @none 用于对没有 @type节点对象进行索引,这有助于维持规范化表示。@none 索引也可以是展开为 @none 的术语,例如示例中使用的术语 none

id 映射 相似,当与 @type 一起使用时,容器也可以包含 @set,以确保键值始终包含在数组中。

类型映射 是 JSON-LD 1.1 中的新特性。

4.7 包含的节点

本节为非规范性内容。

有时将若干节点对象列为另一个节点对象的一部分也很有用。例如,用于表示某资源所使用的一组资源。包含块 也可以用来收集此类次要的 节点对象,这些对象可以从主节点对象中被引用。举例来说,考虑一个包含不同项列表的节点对象,其中某些项共享一些公共元素:

Example 109:包含块
{
  "@context": {
    "@version": 1.1,
    "@vocab": "http://example.org/",
    "classification": {"@type": "@vocab"}
  },
  "@id": "http://example.org/org-1",
  "members": [{
    "@id":"http://example.org/person-1",
    "name": "Manu Sporny",
    "classification": "employee"
  }, {
    "@id":"http://example.org/person-2",
    "name": "Dave Longley",
    "classification": "employee"
  }, {
    "@id": "http://example.org/person-3",
    "name": "Gregg Kellogg",
    "classification": "contractor"
  }],
  "@included": [{
    "@id": "http://example.org/employee",
    "label": "An Employee"
  }, {
    "@id": "http://example.org/contractor",
    "label": "A Contractor"
  }]
}

当进行 扁平化 处理时, 这会将 employeecontractor 元素从 包含块 移动到外部的 数组 中。

包含的资源在 JSON API包含相关资源 一节中有描述,作为在主资源中包含关联资源的一种方式;在 JSON-LD 中,@included 提供了类似的可能性。

由于在 节点对象 中使用 @included 的副产物,某个 map 可能只包含 @included,从而提供与在 § 4.1 高级上下文用法 中讨论的功能相似的功能,那里使用 @graph 来描述不相连的 节点

然而,与 @graph 不同,@included 不会与同一 map 中包含的其他 属性 交互,关于此功能在 § 4.9 命名图 中有进一步讨论。

4.8 反向属性

本节为非规范性内容。

JSON-LD 将有向 进行序列化。这意味着每个 属性 都从一个 节点 指向另一个 节点。然而在某些情况下,希望以相反方向进行序列化。例如,当想在文档中描述某人及其子女时,如果使用的词汇表没有提供 children 属性,只有 parent 属性,那么每个表示子女的节点都必须用指向其父的属性来表达,如下例所示。

使用 JSON-LD 的 @reverse 关键字 可以更简单地表达此类数据:

还可以在展开的术语定义中使用 @reverse 来创建反向属性,如下例所示:

4.9 命名图

本节为非规范性内容。

有时需要对本身而不仅仅是单个节点进行陈述。这可以通过使用@graph 关键字将一组节点分组来完成。开发人员也可以通过将其与 @id 关键字配对来为使用 @graph 表示的数据命名,如下面示例所示:

上例表达了由 IRI 标识的命名图http://example.org/foaf-graph。该图由关于 Manu 和 Gregg 的陈述组成。图本身的元数据通过 generatedAt 属性表达,用以指定图生成的时间。

当 JSON-LD 文档的顶层结构是一个只包含 @graph 和(可选)@contextmap(非映射到 IRI 或关键字的属性会被忽略)时, @graph 被视为表达本该隐含的默认图。当在文档顶层存在若干共享相同 上下文 的节点时(例如文档已被 扁平化),这种机制会很有用。@graph 关键字将这些节点收集到一个 数组中,并允许使用共享上下文。

在这种情况下,由于图包含无关的节点,嵌入不可用。 等价于在数组中使用多个节点对象并在每个节点对象中定义 @context

4.9.1 图容器

本节为非规范性内容。

在某些情况下,将数据逻辑上划分为不同的图而不在 JSON 表达中显式指出是有用的。例如,一个 JSON 文档可能包含一些数据,并在其上断言其他元数据,此时在数据模型中使用命名图的概念来分离这些数据会很有用,而无需使用与@graph关键字相关的语法开销。

扩展的术语定义可以将 @graph 用作其 @container 的值。这表明该术语的值应被视为 命名图,其中图名称是自动分配的 空白节点标识符,从而创建一个隐式命名图。在展开时,这些会变成简单图对象

另一个示例使用了一个匿名的命名图,如下所示:

上例表达了一个匿名的命名图所作的陈述。默认图包含一条陈述,说明该主体写下了该陈述。这是将陈述分离到一个命名图中,然后对该命名图内包含的陈述进行断言的一个示例。

严格来说,此类术语的值并不是一个命名图,而是与该命名图相关联的图名称,该图名称独立地存在于数据集(dataset)中。

图容器(Graph Containers)是 JSON-LD 1.1 中的新特性。

4.9.2 命名图数据索引

本节为非规范性内容。

除了按索引对节点对象进行索引之外, 图对象也可以按索引进行索引。通过在 § 4.9.1 Graph Containers 中引入的 @graph 容器类型与 @index 结合使用,该属性的对象值被视为一个键-值映射, 其中键不是映射到IRI的字符串, 而是取自与其值对应的命名图所关联的 @index 属性。在展开时,这些必须为 简单图对象

下面的示例描述了一个引用多个命名图的默认图,使用了索引映射

索引映射相同,当与@graph一起使用时,容器也可以包含 @set,以确保键值始终包含在数组中。

特殊索引 @none 用于对没有 @index 键的图进行索引,这对于维持规范化表示很有用。但是请注意,将多个未标识的命名图在压缩时使用 @none 索引进行压缩会导致这些图的内容被合并。为防止此情况,请为每个图提供不同的 @index 键。

命名图数据索引(Named Graph Data Indexing)是 JSON-LD 1.1 中的新特性。

4.9.3 命名图索引

本节为非规范性内容。

除了按标识符对节点对象进行索引之外, 图对象也可以按其图名称进行索引。通过在§ 4.9.1 Graph Containers 中引入的 @graph 容器类型与 @id 结合使用,该属性的对象值被视为一个键-值映射,其中键表示作为其值的命名图的标识符。

下面的示例描述了一个引用多个命名图的默认图,使用了一个id 映射

id 映射相同,当与@graph一起使用时,容器也可以包含 @set,以确保键值始终包含在数组中。

id 映射相同,特殊索引 @none 用于为没有 @id命名图建立索引,这有助于维护规范化表示。但是请注意,如果多个图在没有 @id 的情况下被表示,它们在展开时会被合并。为防止这种情况,请谨慎使用 @none,并考虑为图提供各自的标识符。

图容器(Graph Containers)是 JSON-LD 1.1 中的新特性。

4.10 加载文档

本节为非规范性内容。

JSON-LD 1.1 处理算法与 API 规范 [JSON-LD11-API] 定义了JSON-LD 处理器接口,并包含用于操作不同形式 JSON-LD 的多种方法(参见§ 5. JSON-LD 形式)。 这包括用于加载远程文档的一般机制,包括引用的 JSON-LD 文档和远程上下文,并可用于提取嵌入于如 [HTML] 等其他格式中的 JSON-LD。 详见 远程文档与上下文获取 (参见 [JSON-LD11-API])。

documentLoader在需要加载远程文档出现问题的场景下非常有用:

5. JSON-LD 的形式

本节为非规范性内容。

与许多数据格式一样,在 JSON-LD 中描述数据并没有唯一正确的方式。 然而,由于 JSON-LD 用于描述图(graphs),可以使用某些转换来改变数据的形状,而不改变其作为关联数据(Linked Data)的含义。

展开文档形式
Expansion 是将 JSON-LD 文档应用 context 的过程,使得 @context 不再是必要的。 该过程在 § 5.1 展开文档形式 中有更详细的描述。
压缩文档形式
Compaction 是将开发者提供的 context 应用于现有 JSON-LD 文档的过程。该过程在 § 5.2 压缩文档形式 中有进一步说明。
扁平化文档形式
Flattening 是将嵌入节点提取到 JSON 树顶层,并在必要时用引用替换嵌入节点并创建空白节点标识符的过程。该过程在 § 5.3 扁平化文档形式 中有详细描述。
框架化文档形式
Framing 用于使用示例 frame 文档来塑造 JSON-LD 文档中的数据, 该 frame 文档既用于匹配扁平化的数据,也用于展示生成数据时的结构示例。 该过程在 § 5.4 框架化文档形式 中有进一步说明。

5.1 展开文档形式

本节为非规范性内容。

JSON-LD 1.1 Processing Algorithms and API 规范 [JSON-LD11-API] 定义了对 JSON-LD 文档进行“展开”的方法。 Expansion 是将 JSON-LD 文档应用 context 的过程,使得所有 IRI、类型和数值都被展开,从而使得 @context 不再必要。

例如,假设下面的 JSON-LD 输入文档:

Example 123: 要展开的示例 JSON-LD 文档
{
   "@context": {
      "name": "http://xmlns.com/foaf/0.1/name",
      "homepage": {
        "@id": "http://xmlns.com/foaf/0.1/homepage",
        "@type": "@id"
      }
   },
   "name": "Manu Sporny",
   "homepage": "http://manu.sporny.org/"
}

对上述 JSON-LD 输入文档运行 JSON-LD 的 Expansion algorithm 将得到如下输出:

JSON-LD 的媒体类型 定义了一个可用于指示或请求 展开文档形式profile 参数。标识 展开文档形式 的 profile URI 为 http://www.w3.org/ns/json-ld#expanded

5.2 压缩文档形式

本节为非规范性内容。

JSON-LD 1.1 Processing Algorithms and API 规范 [JSON-LD11-API] 定义了对 JSON-LD 文档进行“压缩”的方法。Compaction 是将开发者提供的 context 应用于文档,从而将 IRI 缩短为 termcompact IRI,并将展开形式的 JSON-LD 值转换为如 字符串数字 之类的简单值。 通常这使得以应用特定术语直接使用该文档变得更简单,压缩后的文档通常也更易于人类阅读。

例如,假设下面的 JSON-LD 输入文档:

Example 125: 示例展开的 JSON-LD 文档
[
  {
    "http://xmlns.com/foaf/0.1/name": [ "Manu Sporny" ],
    "http://xmlns.com/foaf/0.1/homepage": [
      {
       "@id": "http://manu.sporny.org/"
      }
    ]
  }
]

此外,假设下面是开发者提供的 JSON-LD 上下文(context):

Example 126: 示例 context
{
  "@context": {
    "name": "http://xmlns.com/foaf/0.1/name",
    "homepage": {
      "@id": "http://xmlns.com/foaf/0.1/homepage",
      "@type": "@id"
    }
  }
}

在上述 context 下运行 JSON-LD 的 Compaction algorithm,对前述 JSON-LD 输入文档进行压缩,将得到如下输出:

JSON-LD 的媒体类型 定义了一个可用于指示或请求 压缩文档形式profile 参数。标识 压缩文档形式 的 profile URI 为 http://www.w3.org/ns/json-ld#compacted

Compaction 的细节在 Compaction algorithm(见 JSON-LD11-API)中有描述。 本节作为向希望为压缩 JSON-LD 文档创建 contexts 的作者提供的简要指南,介绍算法的工作方式。

压缩的目的是将 term definitionsvocabulary mapping默认语言base IRI 应用于现有 JSON-LD 文档, 使其以更适合直接作为 JSON 使用的形式呈现。 这包括尽可能将值表示为 字符串(而不是 值对象), 将 list 对象 简化为普通 数组,反转节点之间的关系,以及使用数据映射来索引多个值而不是将它们表示为值数组。

5.2.1 缩短 IRI

本节为非规范性内容。

在展开的 JSON-LD 文档中,IRI 总是表示为绝对 IRI。在许多情况下,使用更短的形式更可取,可以是 相对 IRI 引用compact IRI,或 term。Compaction 使用 context 中的若干元素来创建这些 IRI 的较短形式。参见 § 4.1.2 默认词汇§ 4.1.3 Base IRI, 以及 § 4.1.5 Compact IRIs 以获取更多细节。

vocabulary mapping 可以用于缩短可能是“vocabulary relative”的 IRI,通过去掉与 vocabulary mapping 匹配的 IRI 前缀。 只要一个 IRI 被确定为 vocabulary relative(例如作为属性使用,或作为 @type 的值,或作为在 term 定义中描述为 "@type": "@vocab" 的 term 的值),就会执行这种缩短。

5.2.2 将值表示为字符串

本节为非规范性内容。

为了避免歧义,展开文档形式 总是使用 节点 和 使用 node objectsvalue objects 来表示节点和数值。 此外,属性值总是包含在数组中,即使只有一个值。有时这有助于保持访问的一致性,但大多数 JSON 数据使用尽可能简单的表示,这意味着属性通常具有单个值,并将其表示为 字符串 或诸如 node objects 的结构化值。 默认情况下,压缩 会将简单字符串值表示为 字符串,但有时一个值是一个 IRI、日期或其他某种带类型的值(typed value), 简单的字符串表示会丢失信息。通过在 term definition 中指定,就可以从所使用的 term 的定义推断字符串值的语义。 有关详细信息,请参见 § 4.2 描述值

5.2.3 将列表表示为数组

本节为非规范性内容。

如在 § 4.3.1 Lists 中所述,JSON-LD 对有序值有一种展开语法,使用 @list 关键字。 为简化 JSON-LD 中的表示,可以在 term 定义中设置 "@container": "@list",这会使得使用该 term 的属性的所有值都被视为有序的。

5.2.4 反转节点关系

本节为非规范性内容。

在某些情况下,用于关联两个节点的属性如果反向表达会更合适,例如在描述两个人与共同父母的关系时。 有关更多细节,请参见 § 4.8 反向属性

当与 framing 结合使用时,反向属性会更有用,framing 实际上可以将顶层文档中定义的 node objects 变成嵌入节点。 JSON-LD 提供了一种方法,通过在 term 定义中定义适当的 @container 定义来对这些值进行索引。

5.2.5 索引值

本节为非规范性内容。

具有多个值的属性通常使用无序的 数组 表示。 这意味着在内部表示该 JSON 的应用需要遍历数组的值以查找匹配特定模式的值,例如使用语言 en 的带语言标记的字符串(language-tagged string)。

数据可以基于多种不同的键进行索引,包括 @id、@type、@language、@index 等。 有关更多细节,请参见 § 4.6 Indexed Values§ 4.9 Named Graphs

5.2.6 将值规范化为对象

本节为非规范性内容。

有时希望在压缩文档的同时保留 node object 和 value object 的表示形式。为此,可以在 term 定义中设置 "@type": "@none"。 这会导致 Value Compaction 算法始终使用值的对象形式,尽管该值的组成部分可能会被压缩。

5.2.7 将单值表示为数组

本节为非规范性内容。

通常在压缩时,只有一个值的属性会表示为字符串或 映射(maps),而具有多个值的属性会表示为字符串或映射的数组。 这意味着访问这些属性的应用需要能接受任一表示。要强制所有值都用数组表示,可以在 term 定义中设置 "@container": "@set"。 此外,@set 可以与其他容器设置结合使用,例如参考我们在 § 5.2.5 索引值 中的语言映射示例:

5.2.8 术语选择

本节为非规范性内容。

在压缩时,Compaction algorithm 仅在属性的值匹配该 term definition@container@type@language 规范时,才会使用该 term 来压缩该属性。 这实际上可能会将值分散到不同的属性中,这些属性实际上引用相同的 IRI。如果没有匹配的 term definition, 压缩算法会使用该属性的绝对 IRI 进行压缩。

5.3 扁平化文档形式

本节为非规范性内容。

JSON-LD 1.1 Processing Algorithms and API 规范 [JSON-LD11-API] 定义了对 JSON-LD 文档进行“扁平化”的方法。 Flattening 会将某个 节点 的所有属性收集到一个单一的 映射 中,并为所有空白节点标注空白节点标识符(blank node identifiers)。 这可确保数据的形状,从而在某些应用中显著简化处理 JSON-LD 所需的代码。

例如,假设下面的 JSON-LD 输入文档:

Example 137: 要扁平化的示例 JSON-LD 文档
{
  "@context": {
    "name": "http://xmlns.com/foaf/0.1/name",
    "knows": "http://xmlns.com/foaf/0.1/knows"
  },
  "@id": "http://me.markus-lanthaler.com/",
  "name": "Markus Lanthaler",
  "knows": [
    {
      "@id": "http://manu.sporny.org/about#manu",
      "name": "Manu Sporny"
    }, {
      "name": "Dave Longley"
    }
  ]
}

对上述输入文档运行 JSON-LD 的 Flattening algorithm 并使用相同的 context,会产生如下输出:

JSON-LD 的媒体类型 定义了一个可用于指示或请求 扁平化文档形式profile 参数。标识 扁平化文档形式 的 profile URI 为 http://www.w3.org/ns/json-ld#flattened。 它可以与标识 展开文档形式压缩文档形式 的 profile URI 结合使用。

5.4 框架化文档形式

本节为非规范性内容。

JSON-LD 1.1 Framing 规范 [JSON-LD11-FRAMING] 定义了对 JSON-LD 文档进行“框架化(framing)”的方法。Framing 用于塑造 JSON-LD 文档中的数据,使用一个示例 frame 文档来匹配扁平化的数据并展示预期的数据结构示例。

例如,假设如下 JSON-LD frame:

Example 139: 示例图书馆 frame
{
  "@context": {
    "@version": 1.1,
    "@vocab": "http://example.org/"
  },
  "@type": "Library",
  "contains": {
    "@type": "Book",
    "contains": {
      "@type": "Chapter"
    }
  }
}

frame 文档描述了一种嵌入结构,会将类型为 Library 的对象置于顶部, 并将那些通过 contains 属性链接到图书馆对象的类型为 Book 的对象作为属性值嵌入其中。同时还会将类型为 Chapter 的对象放置在引用它们的 Book 对象内部,作为该 Book 对象的嵌入值。

当使用与 frame 组件匹配的一组扁平化对象时:

Example 140: 扁平化的图书馆对象示例
{
  "@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",
    "@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"
  }]
}

框架算法可以创建一个遵循该 frame 结构的新文档:

JSON-LD 的媒体类型 定义了一个可用于指示或请求 框架化文档形式profile 参数。标识 框架化文档形式 的 profile URI 为 http://www.w3.org/ns/json-ld#framed

JSON-LD 的媒体类型 还定义了一个 profile 参数,可用于标识包含 frame 的 HTML 文档中的 script 元素。 首个类型为 application/ld+json;profile=http://www.w3.org/ns/json-ld#framescript 元素 将用于查找 frame

7. 在 HTML 文档中嵌入 JSON-LD

注意

本节描述了支持 documentLoader 的功能,该 documentLoader 支持 HTML 脚本提取。 有关更多信息,请参见 远程文档与上下文获取

将 JSON-LD 内容嵌入 HTML [HTML] 很简单,只需将其放在一个 script 元素 中,且将 type 属性设为 application/ld+json。这样会创建一个 data block

如何使用这些数据超出本规范的范围。 嵌入的 JSON-LD 文档可能会被原样提取,或者例如被解释为 RDF。

如果将 JSON-LD 内容提取为 RDF [RDF11-CONCEPTS], 则 MUST 将其展开为一个使用 RDF 数据集 的表示, 并使用 Deserialize JSON-LD to RDF Algorithm [JSON-LD11-API]。 除非指定了特定的脚本(参见 § 7.3 定位特定的 JSON-LD 脚本元素), 所有具有 typeapplication/ld+jsonscript 元素 MUST 被处理并合并成一个单一的数据集,且位于不同脚本元素中的等效空白节点标识符应视为共享(即不同 JSON-LD 脚本元素之间共享空白节点)。

7.1 从 HTML 的 base 元素继承基础 IRI

在处理 JSON-LD 的 script 元素 时, 所在 HTML 文档的 文档基准 URL(Document Base URL), 如 [HTML] 中定义, 被用来确定包含的 JSON-LD 内容的默认 base IRI

HTML 允许对基准 URL 做 动态更改。 本规范不要求任何特定行为,为确保所有系统以等效方式处理 base IRI,作者 SHOULD 要么使用 IRIs,要么按 § 4.1.3 Base IRI 中的明确定义来处理。实现(特别是那些在 DOM 中本地操作的)MAY 考虑 动态基准 URL 的更改

7.2 JSON-LD script 元素内容的限制

本节为非规范性内容。

由于 HTML 中对 <script> 元素内容的限制(见 Restrictions for contents of <script> elements), 对包含在 script 元素 中的 JSON-LD 数据施加了额外的编码限制。

作者应避免在嵌入 HTML 的脚本中使用可能被误解为 comment-openscript-opencomment-closescript-close 的字符序列。

注意
此类内容应按下文所示进行转义,但内容在通过 JSON-LD API 处理后仍将保持转义状态(参见 JSON-LD11-API)。
  • &amp; → & (ampersand,U+0026)
  • &lt; → < (小于号,U+003C)
  • &gt; → > (大于号,U+003E)
  • &quot; → " (引号,U+0022)
  • &apos; → ' (撇号,U+0027)

7.3 定位特定的 JSON-LD 脚本元素

可以使用与 HTML 文档中脚本元素的唯一标识符相匹配的片段标识符(fragment identifier)来定位位于 HTML 文档内的特定 script 元素(参见 DOM 规范中的 unique identifier)。 JSON-LD 处理器 MUST 仅提取指定数据块的内容, 将其解析为独立的 JSON-LD 文档, 并 MUST NOT 将结果与相同 HTML 文档中的任何其他标记合并。

例如,给定位于 http://example.com/document 的 HTML 文档, 可以通过 URL http://example.com/document#dave 来定位 id 为 "dave" 的脚本元素。

8. 数据模型

JSON-LD 是基于 JSON 的关联数据(Linked Data)序列化格式。 因此须区分由 JSON 在 [RFC8259] 定义的语法, 与作为 RDF 数据模型 扩展的 数据模型(参见 [RDF11-CONCEPTS])。 有关 JSON-LD 与 RDF 数据模型之间精确对应的细节,请参阅 § 10. 与 RDF 的关系

为了便于不熟悉 RDF 模型的开发者理解,提供如下概要说明:

JSON-LD 文档 可以 包含上述 数据模型 无法表示的数据。 除非另有说明,此类数据在处理JSON-LD 文档时将被忽略。 这一规则的一个结果是:未映射到 IRI、空白节点或关键字 的属性将被忽略。

另外,JSON 序列化格式在内部使用 JSON-LD 内部表示 来表达, 该内部表示使用通用概念:列表映射(maps)字符串数字布尔值null 来描述由 JSON 文档表示的数据。

该图描绘了一个包含默认图和两个命名图的关联数据集(linked data dataset)。

1 关联数据集的示意图。
附录中提供了该关联数据集图示的说明。图像可用的格式包括 SVG PNG

图中描述的数据集可以如下表示:

注意在最外层使用 @graph 来描述三个顶层资源(其中两个是命名图)。这些命名图在提供每个图的名称时同时使用了 @graph@id

9. JSON-LD 语法

本节以更形式化的方式重述前面各节中描述的语法约定。

一个 JSON-LD 文档 必须 是符合 [RFC8259] 中描述的有效 JSON 文本或可以表示为与有效 JSON 文本 等价的JSON-LD 内部表示 的某种格式

一个 JSON-LD 文档 必须 是单一的 节点对象、仅由键 @context 和/或 @graph 组成的 map, 或一个包含零个或多个 节点对象数组

与 JSON 不同,在 JSON-LD 中,对象 中的键 必须 唯一。

每当在本语法中讨论某个 关键字 时, 这些陈述也适用于该 关键字 的别名。

JSON-LD 允许为 关键字 定义别名(参见 § 4.1.6 关键字别名)。 例如,如果 活动上下文 将术语 id 定义为 @id 的别名, 则该别名可以合法地作为 @id 的替代使用。注意 关键字 的别名在上下文处理期间不会被展开。

9.1 术语

术语 是一种简写的 字符串,可展开为一个 IRI空白节点标识符关键字

术语 不得 等于任何 JSON-LD 的 关键字@type 除外

当作为 前缀 用于 Compact IRI 时,为避免前缀与 IRI scheme 混淆的歧义,术语 不应 来自 IANA 注册的 URI scheme 列表(见 [IANA-URI-SCHEMES])。类似地,为避免 Compact IRI术语 之间的混淆,术语 不应 包含冒号 (:),并且 限制为符合 isegment-nz-nc 形式的字符串(见 RFC3987)。

为避免向前兼容问题,术语 不应@ 字符开头,且后面仅跟一个或多个字母(参见 RFC5234 中的 ALPHA),因为未来的 JSON-LD 版本可能会引入额外的 关键字。此外,术语 不得 为空字符串(""),因为并非所有编程语言都能处理空的 JSON 键。

有关将 术语 映射到 IRIs 的更多讨论,请参见 § 3.1 The Context§ 3.2 IRIs

9.2 节点对象

节点对象 表示由 节点 在被 序列化时的零个或多个属性。一个 map节点对象,前提是它存在于 JSON-LD 的上下文之外,且满足:

在文档中,某个节点属性 可能分布在不同的 节点对象 中。 当发生这种情况时,需要合并不同节点对象的键以创建结果节点的属性。

节点对象 必须 是一个 map。所有那些在活动上下文中既不是 IRIs、也不是 compact IRIs、也不是在活动上下文中有效的 术语,也不是下列 关键字(或这些关键字的别名)的键,(或此类关键字的别名) 必须 在处理时被忽略:

如果 节点对象 包含 @context 键, 则其值 必须null、一个 IRI 引用、 一个 上下文定义,或由上述任一者组成的 数组

如果 节点对象 包含 @id 键, 则其值 必须IRI 引用, 或一个 compact IRI(包括 空白节点标识符)。 有关 @id 值的更多讨论,请参见 § 3.3 节点标识符§ 4.1.5 Compact IRIs§ 4.5.1 识别空白节点

如果 节点对象 包含 @graph 键, 则其值 必须 为一个 节点对象 或 一个包含零个或多个 节点对象数组。 如果该节点对象同时包含 @id 关键字,则该值用作图名称,即命名图的名称。 有关 @graph 值的进一步讨论,请参见 § 4.9 命名图。 特殊情况是:如果一个 map 除了 @graph@context 外没有其他键,且该 map 为 JSON-LD 文档的根,则该 map 不被视为 节点对象;这用于定义可能不形成连通图的 节点对象,允许为所有构成的节点对象共享一个 上下文

如果 节点对象 包含 @type 键, 则其值 必须 为一个 IRI 引用、一个 compact IRI(包括空白节点标识符), 一个在 活动上下文 中定义并可展开为 IRI 的 术语,或上述任一者组成的数组。 有关 @type 值的进一步讨论,请参见 § 3.5 指定类型

如果 节点对象 包含 @reverse 键, 则其值 必须 为一个 map,其中包含表示反向属性的 entries。这些反向属性的每个值 必须IRI 引用compact IRI空白节点标识符节点对象,或包含这些项组合的数组。

如果 节点对象 包含 @included 键, 则其值 必须 为一个 included block。 有关 included block 的进一步讨论,请参见 § 9.13 Included Blocks

如果 节点对象 包含 @index 键, 则其值 必须 为一个 字符串。有关 @index 值的进一步讨论,请参见 § 4.6.1 数据索引

如果 节点对象 包含 @nest 键, 则其值 必须 为一个 map 或 一个由 map 组成的 数组,且这些 map 不得 包含 值对象。 有关 @nest 值的进一步讨论,请参见 § 9.14 属性嵌套

节点对象 中,那些不是 关键字 的键 可以 使用 活动上下文 展开为 IRI。与展开为 IRI 的键相关联的值 必须 为下列之一:

9.3 框架对象

在进行 framing 时, frame object 扩展了 节点对象,以允许用于 framing 的特定 entries

有关如何使用 frame objects 的描述,请参见 [JSON-LD11-FRAMING]。

9.4 图对象

图对象 表示一个 命名图,其 包含显式的 图名称。 一个 map图对象,如果它存在于 JSON-LD 的上下文之外, 包含一个 @graphentry(或该关键字的别名), 它不是 JSON-LD 文档中最顶层的 map,并且其 entries 除了 @graph@index@id@context(或这些关键字的别名)之外不得包含其他条目。

如果 图对象 包含 @context 键, 则其值 必须null、一个 IRI 引用、 一个 上下文定义,或由上述任一者组成的 数组

如果 图对象 包含 @id 键, 则其值用作该命名图的标识符(图名称),并且 必须IRI 引用compact IRI(包括空白节点标识符)。 有关 @id 值的更多讨论,请参见 § 3.3 节点标识符§ 4.1.5 Compact IRIs§ 4.5.1 识别空白节点

不带 @id 条目的 图对象 也称为 简单图对象,表示一个没有显式标识符的命名图,尽管在数据模型中它仍然有一个图名称,该名称是隐式分配的 空白节点标识符

@graph 的值 必须 为一个 节点对象 或 一个包含零个或多个 节点对象数组。 有关 @graph 值的进一步讨论,请参见 § 4.9 命名图

9.5 值对象

值对象 用于显式地将类型或语言与某个值关联,以创建一个 带类型值 或一个带语言标签的字符串(并可能关联一个 基准方向)。

值对象 必须 是一个包含 @value 键的 map。它 可以 还包含 @type@language@direction@index@context 键,但 不得 同时包含 @type@language@direction 键。 值对象 不得 包含任何其他会展开为 IRI 或 关键字 的键。

@value 键对应的值 必须 为 字符串、数字、truefalsenull如果 @type 键的值为 @json,则 @value 的值 可以 为数组或对象。

@type 键对应的值 必须术语、IRI、compact IRI、一个可以通过 vocabulary mapping 转换为 IRI 的字符串、@json,或 null

@language 键对应的值 必须 具有 BCP47 中描述的 词法形式,或为 null

@direction 键对应的值 必须"ltr""rtl",或为 null

@index 键对应的值 必须 为一个字符串。

有关 值对象 的更多信息,请参见 § 4.2.1 带类型值§ 4.2.4 字符串国际化

9.6 值模式

在进行 framing 时, value pattern 扩展了 值对象,以允许用于 framing 的特定 entries

9.7 列表与集合

列表 表示一个有序的值集合(ordered set)。集合表示无序的值集合。除非另有说明,JSON-LD 中的 数组 默认为无序。 因此,当在 JSON-LD 文档正文中使用 @set 关键字时,它仅表示语法糖,在处理文档时会被优化移除。但在文档上下文中使用时非常有用。与 @set@list 容器相关联的术语的值在处理文档时将始终以数组形式表示——即使只有单一值,在压缩文档形式中此值本可被优化为非数组形式时也会保持数组形式。这样简化了后续的处理,因为数据总是处于确定性的形式。

列表对象 必须 是一个 map, 并且其键除了 @list@index 外不得展开为 IRI 或关键字。

集合对象 必须 是一个 map, 并且其键除了 @set@index 外不得展开为 IRI 或关键字。请注意,处理时会忽略 @index 键。

在这两种情况下,键 @list@set 对应的值 必须 为下列类型之一:

有关集合与列表的进一步讨论,请参见 § 4.3 值的顺序

9.8 语言映射

语言映射 用于将语言与值关联,以便于程序化访问。如果一个 术语 在定义时将 @container 设置为 @language或包含 @language@set 的数组),则该术语的值可以是一个 语言映射语言映射 的键 必须 是表示 BCP47 语言标签的字符串、关键字 @none,或展开为 @none 的术语;其值 必须 为下列类型之一:

有关语言映射的更多讨论,请参见 § 4.2.4 字符串国际化

9.9 索引映射

索引映射 允许在 JSON-LD 文档中使用那些没有语义意义但需要被保留的键。如果一个术语在定义时将 @container 设置为 @index或同时包含 @index@set 的数组),则该术语的值可以是一个 索引映射。索引映射的 entries 的值 必须 为下列之一:

有关该主题的更多信息,请参见 § 4.6.1 数据索引

索引映射 还可以用于将索引映射到相关的 命名图, 前提是该术语将 @container 设置为包含 @graph@index 的数组,并可选地包括 @set。值由被引用键索引的 节点对象 组成, 如果值不包含 @id,则可以表示为 简单图对象,否则表示为命名图。

9.10 基于属性的索引映射

基于属性的 index map 是一种 index map 的变体, 其中索引在图中作为属性值语义上被保留。 当某个 term 的定义将 @container 设置为 @index, 或设置为同时包含 @index@set 的数组,且同时定义了一个用作 @indexstring 时, 基于属性的 index map 可以作为 node object 中的术语值使用。 基于属性的 index map 的值 必须node objects 或可展开为 node objectsstrings

在展开时, 如果 active context 包含用于 @index 值的 term definition, 则该 term definition 将用于展开该 index map 的键。 否则,这些键将作为简单的 value objects 来展开。 在 index map 的展开值中,每个 node object 都将被添加一个额外的属性值,属性为 @index 的展开值,值为引用键的展开值。

关于此主题的更多信息,请参见 § 4.6.1.1 基于属性的数据索引

9.11 Id 映射

id map 用于将一个 IRI 关联到一个便于程序访问的值。若在 node object 中将 id map 用作术语值,则要求该 term 的定义将 @container 设置为 @id,或设置为同时包含 @id@set 的数组。id map 的键 MUST 必须是 IRIsIRI referencescompact IRIs(包括 blank node identifiers))、关键字 @none,或展开为 @noneterm,并且其值 MUST 必须是 node objects

如果值包含一个展开为 @id 的属性,则其值 必须 与引用键等价。否则,在展开时,将使用值中的该属性作为该 node object 值的 @id

Id Maps 也可用于将 图名称 映射到其对应的 命名图,前提是该术语将 @container 设置为包含 @graph@id 的数组,并可选地包括 @set。 值由使用引用键命名的 命名图 中包含的 node objects 组成。

9.12 Type 映射

一个 type map 用于将一个 IRI 与便于程序化访问的值相关联。一个 type map 可以在 节点对象 中作为术语值使用, 前提是该 术语 的定义将 @container 设置为 @type,或设置为同时包含 @type@set 的数组。 type map 的键 MUST 必须为 IRIIRI referencescompact IRI(包括 空白节点标识符))、 术语,或关键字 @none, 且其值 MUST 必须为 节点对象 或会展开为 节点对象字符串

如果值包含一个展开为 @type 的属性,且在对引用键和值进行适当展开后该属性的值包含引用键,则该 node object 已包含该类型。否则,在展开时,将把值中的该属性作为该 node object 值的 @type 添加。

9.13 Included Blocks

included block 用于提供一组 node objects。 一个 included block 可以 作为节点对象的成员值出现,键为 @included 或其别名。 一个 included block 要么是一个 node object,要么是一个 node objects 的数组。

在进行 展开 时,多个 included blocks 将被合并为单一的 included block

9.14 属性嵌套

nested property 用于将 属性 从一个 node object 聚合到一个单独的 map,或由若干不是 value objectsmaps 组成的 数组 中。 它在语义上是透明的,并在 展开 过程中被移除。属性嵌套是递归的,嵌套属性的集合可能包含进一步的嵌套。

在语义上,嵌套被视为这些属性和值直接在包含的 node object 中声明。

9.15 上下文定义

context definitionnode object 中定义一个 本地上下文

context definition 必须 是一个 map,其键 必须termscompact IRIsIRIs,或以下 关键字 之一: @base@import@language@propagate@protected@type@version、 或 @vocab

如果 context definition 包含 @base 键, 则其值 必须 为一个 IRI 引用,或 null

如果 context definition 包含 @direction 键, 则其值 必须"ltr""rtl",或为 null

如果 context definition 包含 @import 关键字, 则其值 必须 为一个 IRI 引用。 当作为 @import 的引用使用时,被引用的 context definition 不得 自身包含 @import 键。

如果 context definition 包含 @language 键, 则其值 必须 具有 BCP47 中描述的 词法形式,或为 null

如果 context definition 包含 @propagate 键, 则其值 必须truefalse

如果 context definition 包含 @protected 键, 则其值 必须truefalse

如果 context definition 包含 @type 键, 则其值 必须 是一个仅包含 entry @container 设置为 @setmap, 且可选地包含一个 @protected 条目。

如果 context definition 包含 @version 键, 则其值 必须 是值为 1.1 的数字。

如果 context definition 包含 @vocab 键, 则其值 必须 是一个 IRI 引用、一个 compact IRI、 一个 blank node identifier、 一个 term,或 null

那些不是 关键字 的键的值 必须 是 下列之一: IRIcompact IRItermblank node identifier、关键字、null, 或者一个 expanded term definition

9.15.1 展开的术语定义

expanded term definition 用于描述术语与其展开标识符之间的映射,以及当术语在 node object 中用作键时,与该术语关联的值的其他属性。

expanded term definition 必须 是一个由下列零个或多个键组成的 map@id@reverse@type@language@container@context@prefix@propagate,或 @protectedexpanded term definition 不应 包含其他键。

当相关联的术语是 @type 时,expanded term definition 不得 包含除 @container@protected 之外的键。 @container 的值仅限于单一值 @set

如果被定义的术语不是 IRIcompact IRI, 且 active context 没有 @vocab 映射, 则 expanded term definition 必须 包含 @id 键。

具有以 IRI 或 compact IRI 形式的键的 Term definitions 不得 展开为除其自身键的展开之外的 IRI。

如果 expanded term definition 包含 @id 关键字,其值 必须null、一个 IRIblank node identifiercompact IRI、一项 term,或一个 keyword

如果 expanded term definition 有一个 @reverse 条目, 则它 不得 同时具有 @id@nest 条目, 且其值 必须 是一个 IRIblank node identifiercompact IRI,或 term。 如果存在 @container 条目,其值 必须null@set,或 @index

如果 expanded term definition 包含 @type 关键字, 则其值 必须 为一个 IRIcompact IRItermnull,或下列关键字之一:@id@json@none、或 @vocab

如果 expanded term definition 包含 @language 关键字, 则其值 必须 具有 BCP47 中描述的词法形式,或为 null

如果 expanded term definition 包含 @index 关键字, 则其值 必须 为一个 IRIcompact IRI,或一个 term

如果 expanded term definition 包含 @container 关键字, 则其值 必须 是下列之一: @list@set@language@index@id@graph@type,或为 null ,或为包含上述任一关键字的数组,或为包含 @set 与任意组合的 @index@id@graph@type@language 的数组。 @container 还可以是一个数组,包含 @graph@id@index 之一,并可选地包括 @set 如果值是 @language,当该 term@context 之外使用时,相关联的值 必须 为一个 language map。 如果值是 @index,当该 term@context 之外使用时,相关联的值 必须 为一个 index map

如果 expanded term definition 有一个 @context 条目, 则该条目 必须 是一个有效的 context definition

如果 expanded term definition 包含 @nest 关键字, 则其值 必须@nest,或展开为 @nest 的术语。

如果 expanded term definition 包含 @prefix 关键字, 则其值 必须truefalse

如果 expanded term definition 包含 @propagate 关键字, 则其值 必须truefalse

如果 expanded term definition 包含 @protected 关键字, 则其值 必须truefalse

术语 不得 以循环方式使用。即,某术语的定义不能依赖于另一个术语的定义,若该另一个术语又依赖于第一个术语。

关于 contexts 的更多讨论,请参见 § 3.1 The Context

9.16 关键字

JSON-LD 的 关键字§ 1.7 语法标记与关键字 中有描述,本节说明各关键字可出现在不同 JSON-LD 结构中的位置。

node objectsvalue objectsgraph objectslist objectsset objectsnested properties 中, 可以使用关键字的别名(keyword aliases) 来替代相应关键字,除了 @context@context 关键字 不得 被别名化。 在 本地上下文展开的术语定义 中, 不允许使用关键字别名。

@base
未别名的 @base 关键字 可以context definition 中作为键使用。 其值 必须 是一个 IRI 引用null
@container
未别名的 @container 关键字 可以展开的术语定义 中作为键使用。 其值 必须@list@set@language@index@id@graph@type,或为 null或为包含上述某一关键字的数组,或为在任意顺序下包含 @set 与任一或多个 @index@id@graph@type@language 的组合数组。 值也可为包含 @graph@id@index 之一的数组,并可选地包括 @set
@context
@context 关键字 不得 被别名,并且 可以 在下列对象中作为键使用:

@context 的值 必须null、一个 IRI 引用、一个 context definition,或由这些项组成的数组。

@direction
@direction 关键字 可以 被别名,并且 可以value object 中作为键使用。 其值 必须"ltr""rtl",或为 null

未别名的 @direction 可以context definition 中作为键使用。

有关更多讨论,请参见 § 4.2.4.1 基准方向

@graph
@graph 关键字 可以 被别名,并且 可以node objectgraph object 中作为键使用, 其值 必须value objectnode object,或上述任一项的数组。

未别名的 @graph 可以expanded term definition 中作为 @container 的值使用。

参见 § 4.9 命名图

@id
@id 关键字 可以 被别名并且 可以node objectgraph object 中作为键使用。

未别名的 @id 可以expanded term definition 中作为键使用,或作为该定义中 @container 键的值。

@id 键的值 必须IRI 引用,或 compact IRI(包括空白节点标识符)。

参见 § 3.3 节点标识符§ 4.1.5 Compact IRIs§ 4.5.1 识别空白节点 以获取关于 @id 值的更多讨论。

@import
未别名的 @import 关键字 可以context definition 中使用。 其值 必须 为一个 IRI 引用。 参见 § 4.1.10 导入的上下文 以获取进一步讨论。
@included
@included 关键字 可以 被别名,其值 必须 是一个 included block。 该关键字在 § 4.7 包含的节点§ 9.13 Included Blocks 中有更详细描述。
@index
@index 关键字 可以 被别名并且 可以 用作 node objectvalue objectgraph objectset objectlist object 中的键。 其值 必须 是一个字符串。

未别名的 @index 可以expanded term definition 中作为 @container 的值使用,亦可作为该定义中的一个条目,其中值为 IRIcompact IRIterm

参见 § 9.9 Index Maps§ 4.6.1.1 基于属性的数据索引 以获取进一步讨论。

@json
@json 关键字 可以 被别名,并且 可以value objectexpanded term definition 中作为 @type 的值使用。

参见 § 4.2.2 JSON 字面量

@language
@language 关键字 可以 被别名并且 可以value object 中作为键使用。 其值 必须 是一个具有 BCP47 词法形式的字符串,或为 null

未别名的 @language 可以context definition 中作为键使用,或在 expanded term definition 中作为 @container 的值使用。

参见 § 4.2.4 字符串国际化§ 9.8 语言映射

@list
@list 关键字 可以 被别名,且 必须list object 中作为键使用。 未别名的 @list 可以expanded term definition 中作为 @container 的值使用。 其值 必须 为下列之一:

关于集合与列表的进一步讨论,请参见 § 4.3 值的顺序

@nest
@nest 关键字 可以 被别名并且 可以node object 中作为键使用,其值必须是一个 map

未别名的 @nest 可以simple term definition 中作为值使用,或在 expanded term definition 中作为键使用,其值 必须 是展开为 @nest 的字符串。

有关更多讨论,请参见 § 9.14 属性嵌套

@none
@none 关键字 可以 被别名并且 可以 用作 index mapid maplanguage maptype map 中的键。 参见 § 4.6.1 数据索引§ 4.6.2 语言索引§ 4.6.3 节点标识符索引§ 4.6.4 节点类型索引§ 4.9.3 命名图索引§ 4.9.2 命名图数据索引 以获取更多讨论。
@prefix
未别名的 @prefix 关键字 可以expanded term definition 中作为键使用。 其值 必须truefalse。 参见 § 4.1.5 Compact IRIs§ 9.15 上下文定义 以获取进一步讨论。
@propagate
未别名的 @propagate 关键字 可以context definition 中使用。 其值 必须truefalse。 参见 § 4.1.9 上下文传播 以获取进一步讨论。
@protected
未别名的 @protected 关键字 可以context definitionexpanded term definition 中使用。 其值 必须truefalse。 参见 § 4.1.11 受保护的术语定义 以获取进一步讨论。
@reverse
@reverse 关键字 可以 被别名并且 可以node object 中作为键使用。

未别名的 @reverse 可以expanded term definition 中作为键使用。

@reverse 键的值 必须 是一个 IRI 引用,或一个 compact IRI(包括空白节点标识符)。

参见 § 4.8 反向属性§ 9.15 上下文定义 以获取进一步讨论。

@set
@set 关键字 可以 被别名并且 必须set object 中作为键使用。 其值 必须 为下列之一:

未别名的 @set 可以expanded term definition 中作为 @container 的值使用。

关于集合与列表的进一步讨论,请参见 § 4.3 值的顺序

@type
@type 关键字 可以 被别名并且 可以node objectvalue object 中作为键使用, 其值 必须termIRI 引用,或 compact IRI(包括空白节点标识符)。

未别名的 @type 可以expanded term definition 中作为键使用,其值也可以是 @id@vocab,或在该定义中作为 @container 的值使用。

在上下文中,@type 可作为 expanded term definition 的键使用,其条目仅限于 @container@protected

该关键字在 § 3.5 指定类型§ 4.2.1 带类型值 中有进一步描述。

@value
@value 关键字 可以 被别名并且 必须value object 中作为键使用。 其对应的值 必须 为 字符串、数字、truefalsenull。 该关键字在 § 9.5 值对象 中有更详细描述。
@version
未别名的 @version 关键字 可以context definition 中使用。 其值 必须 是一个值为 1.1 的数字。 该关键字在 § 9.15 上下文定义 中有进一步描述。
@vocab
未别名的 @vocab 关键字 可以context definition 中作为键使用,或在 expanded term definition 中作 @type 的值使用。 其值 必须 是一个 IRI 引用compact IRI、空白节点标识符、term,或 null。 该关键字在 § 9.15 上下文定义§ 4.1.2 默认词汇 中有进一步讨论。

10. 与 RDF 的关系

JSON-LD 是一种如 [RDF11-CONCEPTS] 所描述的 具体的 RDF 语法。 因此,JSON-LD 文档既是 RDF 文档,也是 一个 JSON 文档,并相应地表示一个 RDF 数据模型 的实例。 然而,JSON-LD 还扩展了 RDF 数据模型,以可选地允许 JSON-LD 序列化 广义 RDF 数据集。 JSON-LD 对 RDF 数据模型的扩展包括:

使用 空白节点标识符 来标注属性 的做法已被视为过时,可能在未来的 JSON-LD 版本中移除,支持 广义 RDF 数据集 的功能也可能被移除。

综上所述,这些差异意味着 JSON-LD 能够序列化任何 RDF 的数据集,并且大多数但并非全部 JSON-LD 文档可以直接按 RDF 1.1 Concepts [RDF11-CONCEPTS] 中描述的方式被解释为 RDF。

强烈建议作者避免使用 空白节点标识符 来标注属性, 可考虑以下替代机制:

用于将 JSON-LD 解读为 RDF 以及将 RDF 序列化为 JSON-LD 的规范算法在 JSON-LD 1.1 Processing Algorithms and API 规范中有说明 [JSON-LD11-API]。

尽管 JSON-LD 可以序列化 RDF 数据集, 它也可以用作一个 图源(graph source)。 在这种情况下,使用者 必须 只使用 默认图 并忽略所有 命名图。 这允许服务器使用 HTTP 内容协商 来同时公开 Turtle 和 JSON-LD 等语言的数据。

同时支持数据集语法和图语法的发布者必须确保主数据存储在 默认图 中,以便不支持 数据集 的使用者也能处理这些信息。

10.1 RDF 的序列化/反序列化

本节为非规范性内容。

将 RDF 序列化为 JSON-LD 以及将 JSON-LD 反序列化为 RDF 的过程取决于执行 JSON-LD 1.1 Processing Algorithms and API 规范中定义的算法,特别是 RDF 序列化-反序列化 算法。 本文档不详细展开这些算法,但为说明该过程提供了必要操作的概要。

将 JSON-LD 文档反序列化为 RDF 的步骤如下:

  1. 展开 JSON-LD 文档,去掉任何上下文;这确保属性、类型和数值被赋予它们的完整表示形式(例如扩展为 IRIs 和展开的值)。 关于 展开 的进一步讨论见 § 5.1 Expanded Document Form
  2. 扁平化文档,将文档转换为一组 节点对象 的数组。关于扁平化的更多讨论见 § 5.3 Flattened Document Form
  3. 将每个 节点对象 转换为一系列的 三元组

例如,考虑下面的紧凑形式的 JSON-LD 文档:

Example 151: 示例 JSON-LD 文档
{
  "@context": {
    "name": "http://xmlns.com/foaf/0.1/name",
    "knows": "http://xmlns.com/foaf/0.1/knows"
  },
  "@id": "http://me.markus-lanthaler.com/",
  "name": "Markus Lanthaler",
  "knows": [
    {
      "@id": "http://manu.sporny.org/about#manu",
      "name": "Manu Sporny"
    }, {
      "name": "Dave Longley"
    }
  ]
}

针对上例运行 JSON-LD 的 ExpansionFlattening 算法会产生如下输出:

Example 152: 上一示例的扁平化并展开后的形式
[
  {
    "@id": "_:b0",
    "http://xmlns.com/foaf/0.1/name": "Dave Longley"
  }, {
    "@id": "http://manu.sporny.org/about#manu",
    "http://xmlns.com/foaf/0.1/name": "Manu Sporny"
  }, {
    "@id": "http://me.markus-lanthaler.com/",
    "http://xmlns.com/foaf/0.1/name": "Markus Lanthaler",
    "http://xmlns.com/foaf/0.1/knows": [
      { "@id": "http://manu.sporny.org/about#manu" },
      { "@id": "_:b0" }
    ]
  }
]

将其反序列化为 RDF 的过程就是把每个 节点对象 转换为一个或多个 三元组。这可以用 Turtle 表示如下:

Example 153: 展开/扁平化文档的 Turtle 表示
@prefix foaf: <http://xmlns.com/foaf/0.1/> .

_:b0 foaf:name "Dave Longley" .

<http://manu.sporny.org/about#manu> foaf:name "Manu Sporny" .

<http://me.markus-lanthaler.com/> foaf:name "Markus Lanthaler" ;
    foaf:knows <http://manu.sporny.org/about#manu>, _:b0 .

将 RDF 序列化为 JSON-LD 的过程可以被视为上述最后一步的逆过程,创建一个与 RDF 三元组紧密匹配的展开的 JSON-LD 文档:对于具有相同主语的所有三元组使用单个 节点对象,对于具有相同谓词的三元组使用单个 属性。然后可以使用 [JSON-LD11-FRAMING] 中描述的 Framing Algorithm 来对结果进行构造,以创建期望的对象嵌入。

10.2 rdf:JSON 数据类型

RDF 允许将 JSON 内容作为一种可能的 文字值。这允许在文字值中包含标记(markup)。 这种内容在 中使用数据类型为 rdf:JSON文字 来表示。

rdf:JSON 数据类型定义如下:

表示该数据类型的 IRI
http://www.w3.org/1999/02/22-rdf-syntax-ns#JSON
词法空间(lexical space)
是符合 JSON 语法(参见 JSON Grammar)的 UNICODE 字符串集合,详见 [RFC8259] 的第 2 节 JSON Grammar。
值空间(value space)
是符合 JSON 语法的 UNICODE 字符串集合,且还需满足以下约束:
  • 不得包含任何不必要的空白,
  • 对象中的键 必须 按字典序排序,
  • 原生数值必须按照 [ECMASCRIPT] 的第 7.1.12.1 节进行序列化,
  • 字符串必须将 Unicode 代码点 U+0000 至 U+001F 使用小写十六进制 Unicode 表示法(\uhhhh)序列化,除了一些预定义的 JSON 控制字符 U+0008U+0009U+000AU+000CU+000D,这些字符 应当 序列化为 \b\t\n\f\r。所有其他 Unicode 字符 应当 原样序列化,除了 U+005C(反斜杠)和 U+0022(双引号),这两个字符 应当 分别序列化为 \\\"
议题
JSON 规范化方案(JSON Canonicalization Scheme,JCS)[RFC8785] 正在成为一个新兴的 JSON 规范化标准。 本规范可能会更新为要求使用这样的规范化表示。用户应谨慎,不要依赖 JSON 字面量 的词法表示作为 RDF 文字,因为在本文件的未来修订中序列化的具体细节可能会发生变化。
尽管被定义为字符串集合,但该值空间被视为与 xsd:string 的值空间不同,以避免与现有规范产生副作用。
词法到值的映射(lexical-to-value mapping)
将词法空间中的任一元素映射为以下结果:
  1. 首先将其解析为与 [ECMASCRIPT] 的内部表示一致的内部表示(使用 JSON.parse,参见 Section 24.5 The JSON Object),
  2. 然后按 JSON 格式 [RFC8259] 重新序列化,且符合上述值空间的约束。
规范映射(canonical mapping)
将值空间的任一元素映射到词法空间中相同的字符串。

10.3 i18n 命名空间

本节为非规范性内容。

i18n 命名空间用于在 语言标签基准方向 的组合中对 RDF 文字 进行描述。它作为一种替代机制,用于描述那些本来会使用 xsd:stringrdf:langString 数据类型的 RDF 文字 的 BCP47 语言标签和基准方向。

基于该命名空间的数据类型允许在使用基准方向的情况下对 JSON-LD 文档进行往返转换,尽管该机制并非标准化。

Deserialize JSON-LD to RDF Algorithm 可以与 rdfDirection 选项配合使用,将其设置为 i18n-datatype,以使用 i18n 基准通过在 https://www.w3.org/ns/i18n# 后附加 @language(如有)并加下划线 ("_") 再附加 @direction 的值来生成对包含 @direction 的值对象进行编码的 IRI,从而生成 RDF 文字

为提高互操作性,在创建数据类型 IRI 时会将 语言标签 规范化为小写。

下面的示例显示了两个文字值为 i18n:ar-EG_rtl 的语句,该 IRI 编码了语言标签 ar-EG 和基准方向 rtl

@prefix ex: <http://example.org/> .
@prefix i18n: <https://www.w3.org/ns/i18n#> .

# Note that this version preserves the base direction using a non-standard datatype.
[
  ex:title "HTML و CSS: تصميم و إنشاء مواقع الويب"^^i18n:ar-eg_rtl;
  ex:publisher "مكتبة"^^i18n:ar-eg_rtl
] .

有关在字符串中使用 § 4.2.4.1 Base Direction 的更多细节,请参见该节。

10.4 rdf:CompoundLiteral 类以及 rdf:languagerdf:direction 属性

本节为非规范性内容。

本规范定义了 rdf:CompoundLiteral 类,该类在 rdf:languagerdf:direction 的域中使用,用于描述包含基准方向且可能带有语言标签的 RDF 文字值,这些文字值将作为同一主题上 rdf:value 的字符串值进行关联。

rdf:CompoundLiteral
表示复合文字的类。
rdf:language
一个 RDF 的 属性。该属性的取值范围是 rdfs:Literal,其值 必须 是符合 [BCP47] 的良构 语言标签。 该属性的域是 rdf:CompoundLiteral
rdf:direction
一个 RDF 的 属性。该属性的取值范围是 rdfs:Literal,其值 必须"ltr""rtl"。该属性的域是 rdf:CompoundLiteral

Deserialize JSON-LD to RDF Algorithm 可以与 rdfDirection 选项配合使用,将其设置为 compound-literal,以生成使用这些属性来描述基准方向和可选语言标签(规范化为小写)的 RDF 文字,这些信息来自包含 @direction(并可选地包含 @language)的值对象。

为提高互操作性,在创建数据类型 IRI 时会将 语言标签 规范化为小写。

下面的示例展示了两个具有复合文字的语句,这些复合文字表示带有语言标签 ar-EG 和基准方向 rtl 的字符串。

@prefix ex: <http://example.org/> .

# Note that this version preserves the base direction using a bnode structure.
[
  ex:title [
    rdf:value "HTML و CSS: تصميم و إنشاء مواقع الويب",
    rdf:language "ar-eg",
    rdf:direction "rtl"
  ];
  ex:publisher [
    rdf:value "مكتبة",
    rdf:language "ar-eg",
    rdf:direction "rtl"
  ]
] .

有关在字符串中使用 § 4.2.4.1 Base Direction 的更多细节,请参见该节。

11. 安全注意事项

参见 Security Considerations,位于 § C. IANA Considerations

本规范的未来版本可能会纳入子资源完整性(Subresource Integrity,SRI)[SRI] 作为确保缓存和检索的内容与远程服务器数据匹配的一种手段;参见 issue 86

12. 隐私注意事项

检索外部上下文会暴露 JSON-LD 处理器的操作,允许中间节点通过检查检索到的资源来对客户端应用进行指纹识别(参见 [fingerprinting-guidance]),并为中间人攻击提供机会。 为了防范这些风险,发布者应考虑缓存远程上下文以备将来使用,或使用 documentLoader 来维护这些上下文的本地副本。

13. 国际化注意事项

由于 JSON-LD 使用 RDF 数据模型,其在正确记录作为 JSON-LD 值 的字符串(即带有左右方向指示的字符串)方面存在设计上的限制。 JSON-LD 与 RDF 都提供了为字符串指定语言的机制(带语言标记的字符串),但并未提供指示字符串 基准方向 的手段。

Unicode 提供了一种在字符串中指示方向的机制(参见 Unicode Bidirectional Algorithm [UAX9]),但当字符串的整体 基准方向 无法由字符串开头确定时,需要外部指示器,例如 HTML 的 dir 属性,而目前在 RDF 文字中没有对应的机制。

在 RDF 中适当表示 基准方向 的问题超出了本工作组可以处理的范围,因为这是核心 RDF 数据模型的限制。本工作组期望未来的 RDF 工作组会考虑此问题并为 带语言标记的字符串 添加指定基准方向的能力。

在可以在未来规范版本中解决该问题之前,发布者在表示那些其字符串的 基准方向 无法仅从字符串内容推断出来的字符串时,应考虑该问题。 有关在 Web 上识别字符串语言和基准方向的最佳实践讨论,请参见 [string-meta]。

A. 图像说明

本节为非规范性内容。

A.1 关联数据集

本节为非规范性内容。

本节描述了 关联数据集图,位于 § 8. 数据模型 中。

该图由三个虚线框组成,每个框描述一个不同的关联数据图。每个框包含用箭头连接的形状,用于描述关联数据之间的关系。

第一个框标题为“default graph: <no name>”,描述了两个资源:http://example.com/people/alicehttp://example.com/people/bob(分别表示 “Alice” 和 “Bob”),两者由标注为 schema:knows 的箭头连接,表示它们之间的 knows 关系。此外,“Alice” 资源还与三个不同的字面量有关:

Alice
一个没有数据类型或语言的 RDF 文字。
weiblich | de
一个带语言标记的字符串,值为 "weiblich",语言标签为 "de"。
female | en
一个带语言标记的字符串,值为 "female",语言标签为 "en"。

第二个和第三个框描述了两个命名图,图名称分别为 "http://example.com/graphs/1" 和 "http://example.com/graphs/1"。

第二个框包含两个资源: http://example.com/people/alicehttp://example.com/people/bob, 它们通过 schema:parent 关系相关联,并且将 http://example.com/people/bob 命名为 "Bob"。

第三个框包含两个资源,一个名为 http://example.com/people/bob,另一个未命名。 这两个资源通过 schema:sibling 关系相互关联,第二个资源的名称为 "Mary"。

B. 与其他关联数据格式的关系

本节为非规范性内容。

下面的 JSON-LD 示例演示了如何使用 JSON-LD 来表达以其他关联数据格式(例如 Turtle、RDFa 和 Microdata)标注的语义数据。这些部分仅用于证明 JSON-LD 在不同关联数据方法之间具有很强的表达力。

B.1 Turtle

本节为非规范性内容。

下面是将以 [Turtle] 表示的 RDF 转换为 JSON-LD 的示例。

B.1.1 前缀定义

JSON-LD 的 context 与 Turtle 的 @prefix 声明有直接对应关系:

Example 154:以 Turtle 序列化的一组语句
@prefix foaf: <http://xmlns.com/foaf/0.1/> .

<http://manu.sporny.org/about#manu> a foaf:Person;
  foaf:name "Manu Sporny";
  foaf:homepage <http://manu.sporny.org/> .
Example 155:相同语句集合以 JSON-LD 序列化
{
  "@context": {
    "foaf": "http://xmlns.com/foaf/0.1/"
  },
  "@id": "http://manu.sporny.org/about#manu",
  "@type": "foaf:Person",
  "foaf:name": "Manu Sporny",
  "foaf:homepage": { "@id": "http://manu.sporny.org/" }
}

B.1.2 嵌入

Turtle 与 JSON-LD 都允许嵌入,尽管 Turtle 仅允许嵌入空白节点

Example 156:在 Turtle 中嵌入
@prefix foaf: <http://xmlns.com/foaf/0.1/> .

<http://manu.sporny.org/about#manu>
  a foaf:Person;
  foaf:name "Manu Sporny";
  foaf:knows [ a foaf:Person; foaf:name "Gregg Kellogg" ] .
Example 157:相同嵌入示例的 JSON-LD 表示
{
  "@context": {
    "foaf": "http://xmlns.com/foaf/0.1/"
  },
  "@id": "http://manu.sporny.org/about#manu",
  "@type": "foaf:Person",
  "foaf:name": "Manu Sporny",
  "foaf:knows": {
    "@type": "foaf:Person",
    "foaf:name": "Gregg Kellogg"
  }
}

B.1.3 原生数据类型的转换

在 JSON-LD 中,数字和布尔值是原生数据类型。虽然 [Turtle] 有简写语法来表示此类值,但 RDF 的抽象语法要求数字和布尔值表示为带类型的文字。因此,为实现完全的往返转换,JSON-LD 1.1 Processing Algorithms and API 规范 [JSON-LD11-API] 定义了 JSON-LD 原生数据类型与 RDF 对应类型之间的转换规则。没有小数部分的数字被转换为 xsd:integer 类型的文字,有小数部分的数字被转换为 xsd:double 类型的文字,布尔值 truefalse 被转换为 xsd:boolean 类型的文字。所有带类型的文字都采用规范词法形式。

Example 158:在 JSON-LD 中使用原生数据类型表示数字和布尔值
{
  "@context": {
    "ex": "http://example.com/vocab#"
  },
  "@id": "http://example.com/",
  "ex:numbers": [ 14, 2.78 ],
  "ex:booleans": [ true, false ]
}
Example 159:相同示例在 Turtle 中使用带类型的文字
@prefix ex: <http://example.com/vocab#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .

<http://example.com/>
  ex:numbers "14"^^xsd:integer, "2.78E0"^^xsd:double ;
  ex:booleans "true"^^xsd:boolean, "false"^^xsd:boolean .
请注意,该解释与 [Turtle] 不同,在 Turtle 中字面量 2.78 被解释为 xsd:decimal。原因在于大多数 JSON 工具将带小数的数字解析为 浮点数,因此使用 xsd:double 来在 RDF 中重新表示它们更为合适。

B.1.4 列表

JSON-LD 与 [Turtle] 都可以表示有序值的序列列表。

Example 160:Turtle 中的值列表
@prefix foaf: <http://xmlns.com/foaf/0.1/> .

<http://example.org/people#joebob> a foaf:Person;
  foaf:name "Joe Bob";
  foaf:nick ( "joe" "bob" "jaybee" ) .
Example 161:相同示例在 JSON-LD 中的列表表示
{
  "@context": {
    "foaf": "http://xmlns.com/foaf/0.1/"
  },
  "@id": "http://example.org/people#joebob",
  "@type": "foaf:Person",
  "foaf:name": "Joe Bob",
  "foaf:nick": {
    "@list": [ "joe", "bob", "jaybee" ]
  }
}

B.2 RDFa

本节为非规范性内容。

下面的示例使用 RDFa [RDFA-CORE] 描述了三个人及其各自的姓名和主页。

Example 162:描述三个人的 RDFa 片段
<div prefix="foaf: http://xmlns.com/foaf/0.1/">
   <ul>
      <li typeof="foaf:Person">
        <a property="foaf:homepage" href="http://example.com/bob/">
          <span property="foaf:name">Bob</span>
        </a>
      </li>
      <li typeof="foaf:Person">
        <a property="foaf:homepage" href="http://example.com/eve/">
         <span property="foaf:name">Eve</span>
        </a>
      </li>
      <li typeof="foaf:Person">
        <a property="foaf:homepage" href="http://example.com/manu/">
          <span property="foaf:name">Manu</span>
        </a>
      </li>
   </ul>
</div>

下面给出一个使用单一 context 的 JSON-LD 实现示例。

Example 163:相同描述的 JSON-LD(节点对象共享上下文)
{
  "@context": {
    "foaf": "http://xmlns.com/foaf/0.1/",
    "foaf:homepage": {"@type": "@id"}
  },
  "@graph": [
    {
      "@type": "foaf:Person",
      "foaf:homepage": "http://example.com/bob/",
      "foaf:name": "Bob"
    }, {
      "@type": "foaf:Person",
      "foaf:homepage": "http://example.com/eve/",
      "foaf:name": "Eve"
    }, {
      "@type": "foaf:Person",
      "foaf:homepage": "http://example.com/manu/",
      "foaf:name": "Manu"
    }
  ]
}

B.3 Microdata

本节为非规范性内容。

下面的 HTML Microdata [MICRODATA] 示例将书籍信息表示为一个 Microdata 的 Work 项目。

Example 164:使用 Microdata 描述图书的 HTML
<dl itemscope
    itemtype="http://purl.org/vocab/frbr/core#Work"
    itemid="http://purl.oreilly.com/works/45U8QJGZSQKDH8N">
 <dt>Title</dt>
 <dd><cite itemprop="http://purl.org/dc/elements/1.1/title">Just a Geek</cite></dd>
 <dt>By</dt>
 <dd><span itemprop="http://purl.org/dc/elements/1.1/creator">Wil Wheaton</span></dd>
 <dt>Format</dt>
 <dd itemprop="http://purl.org/vocab/frbr/core#realization"
     itemscope
     itemtype="http://purl.org/vocab/frbr/core#Expression"
     itemid="http://purl.oreilly.com/products/9780596007683.BOOK">
  <link itemprop="http://purl.org/dc/elements/1.1/type" href="http://purl.oreilly.com/product-types/BOOK">
  Print
 </dd>
 <dd itemprop="http://purl.org/vocab/frbr/core#realization"
     itemscope
     itemtype="http://purl.org/vocab/frbr/core#Expression"
     itemid="http://purl.oreilly.com/products/9780596802189.EBOOK">
  <link itemprop="http://purl.org/dc/elements/1.1/type" href="http://purl.oreilly.com/product-types/EBOOK">
  Ebook
 </dd>
</dl>

注意,Microdata 信息的 JSON-LD 表示保持了 Microdata 社区避免使用 context 的初衷,而是通过引用完整的 IRI 来识别项。

Example 165:相同图书描述的 JSON-LD(避免使用上下文)
[
  {
    "@id": "http://purl.oreilly.com/works/45U8QJGZSQKDH8N",
    "@type": "http://purl.org/vocab/frbr/core#Work",
    "http://purl.org/dc/elements/1.1/title": "Just a Geek",
    "http://purl.org/dc/elements/1.1/creator": "Wil Wheaton",
    "http://purl.org/vocab/frbr/core#realization":
    [
      {"@id": "http://purl.oreilly.com/products/9780596007683.BOOK"},
      {"@id": "http://purl.oreilly.com/products/9780596802189.EBOOK"}
    ]
  }, {
    "@id": "http://purl.oreilly.com/products/9780596007683.BOOK",
    "@type": "http://purl.org/vocab/frbr/core#Expression",
    "http://purl.org/dc/elements/1.1/type": {"@id": "http://purl.oreilly.com/product-types/BOOK"}
  }, {
    "@id": "http://purl.oreilly.com/products/9780596802189.EBOOK",
    "@type": "http://purl.org/vocab/frbr/core#Expression",
    "http://purl.org/dc/elements/1.1/type": {"@id": "http://purl.oreilly.com/product-types/EBOOK"}
  }
]

C. IANA 注意事项

本节已提交给互联网工程指导组(IESG)以供审查、批准并在 IANA 注册。

application/ld+json

类型名称:
application
子类型名称:
ld+json
必需参数:
不适用
可选参数:
profile

一个由空格分隔的非空 URI 列表,用于标识根据 [RFC6906] 对 JSON-LD 文档适用的特定约束或约定。profile 不会在没有 profile 知识的情况下改变资源表示的语义,因此具备或不具备 profile 知识的客户端都可以安全地使用相同的表示。profile 参数 可以 被客户端用于在内容协商过程中表达偏好。如果给定了 profile 参数,服务器 应当 返回符合其识别的列表中 profile 的文档,并且 必须 忽略列表中其不识别的 profile。建议 profile URI 可被解析并在该 URI 提供有用文档。有关更多信息,请参阅 [RFC6906]。

本规范为 profile 参数定义了六个值。

http://www.w3.org/ns/json-ld#expanded
请求或指定 展开的 JSON-LD 文档形式
http://www.w3.org/ns/json-ld#compacted
请求或指定 压缩的 JSON-LD 文档形式
http://www.w3.org/ns/json-ld#context
请求或指定一个 JSON-LD 上下文文档
http://www.w3.org/ns/json-ld#flattened
请求或指定 扁平化的 JSON-LD 文档形式
http://www.w3.org/ns/json-ld#frame
请求或指定一个 JSON-LD frame 文档
http://www.w3.org/ns/json-ld#framed
请求或指定 构造后的 JSON-LD 文档形式

所有以 http://www.w3.org/ns/json-ld 开头的其他 URI 保留供未来 JSON-LD 规范使用。

其他规范可能会发布额外的 profile 参数 URI 及其定义语义,这包括将文件扩展名与 profile 参数关联的能力。

当作为 媒体类型参数 在 HTTP Accept 头中使用时,若包含空白等特殊字符,则 profile 参数的值 必须 用引号括起,这在多个 profile URI 被组合时是必要的。

在处理 "profile" 媒体类型参数时,需要注意其值包含一个或多个 URI 而不是 IRI。在某些情况下,可能需要按照 RFC3987 中指定的方式在 IRI 与 URI 之间进行转换。

编码注意事项:
参见 RFC 8259 第 11 节
安全注意事项:
参见 RFC 8259 第 12 节 [RFC8259]

由于 JSON-LD 旨在作为有向图的数据交换格式,序列化 不应 通过诸如 JavaScript 的 eval() 之类的代码执行机制来解析。一个(无效的)文档可能包含在执行时导致意外副作用的代码,从而损害系统安全。

在处理 JSON-LD 文档时,通常会自动跟随对远程上下文和 frame 的链接,从而在未显式请求每个文件的情况下传输文件。如果远程上下文由第三方提供,可能会使其收集使用模式或类似信息,从而引发隐私顾虑。具体实现(如 JSON-LD 1.1 Processing Algorithms and API 中定义的 API)可能提供精细的机制来控制此类行为。

从 Web 加载的 JSON-LD 上下文(例如通过 HTTP)有被攻击者篡改的风险,从而可能以一种危及安全的方式修改 JSON-LD 的 活动上下文。建议任何依赖远程上下文用于关键任务的应用在使用前对该远程上下文进行审查并缓存。

鉴于 JSON-LD 允许以短术语替代长 IRI,被处理后的 JSON-LD 文档在展开时可能大幅膨胀,在最坏情况下可能耗尽接收方的所有资源。应用应对接收到的数据持谨慎态度。

由于 JSON-LD 对可使用的 IRI 方案没有限制,并且词汇相对 IRI 使用字符串拼接而非 IRI 解析,可能会构造出在解引用时存在恶意用途的 IRI。

互操作性注意事项:
不适用
发布的规范:
http://www.w3.org/TR/json-ld
使用此媒体类型的应用:
任何需要交换有向图的编程环境。已为 JavaScript、Python、Ruby、PHP 和 C++ 等语言实现了 JSON-LD。
附加信息:
魔数(Magic number(s)):
不适用
文件扩展名:
.jsonld
Macintosh 文件类型代码:
TEXT
联系人姓名与电子邮件:
Ivan Herman <ivan@w3.org>
预期用法:
通用
使用限制:
不适用
作者:
Manu Sporny, Dave Longley, Gregg Kellogg, Markus Lanthaler, Niklas Lindström
变更控制者:
W3C

application/ld+json 中使用的片段标识符按 RDF 语法处理,遵循 RDF 1.1 Concepts and Abstract Syntax 的规定 [RDF11-CONCEPTS]。

此注册为对 [JSON-LD10] 中原始定义 application/ld+json 的更新。

C.1 示例

本节为非规范性内容。

下面的示例说明了 profile 参数可用于描述不同可接受响应的不同方式。

Example 166:带 profile 请求展开文档的 HTTP 请求
GET /ordinary-json-document.json HTTP/1.1
Host: example.com
Accept: application/ld+json;profile=http://www.w3.org/ns/json-ld#expanded

请求服务器以 展开文档形式 返回所请求的资源作为 JSON-LD。

Example 167:带 profile 请求压缩文档的 HTTP 请求
GET /ordinary-json-document.json HTTP/1.1
Host: example.com
Accept: application/ld+json;profile=http://www.w3.org/ns/json-ld#compacted

请求服务器以 压缩文档形式 返回所请求的资源作为 JSON-LD。由于未指定显式的上下文资源,服务器将使用应用程序特定的默认上下文进行压缩。

Example 168:带 profile 请求压缩并带压缩上下文引用的 HTTP 请求
GET /ordinary-json-document.json HTTP/1.1
Host: example.com
Accept: application/ld+json;profile="http://www.w3.org/ns/json-ld#flattened http://www.w3.org/ns/json-ld#compacted"

请求服务器同时以 压缩文档形式扁平化文档形式 返回所请求的资源。注意由于使用空白分隔两个 URI,因此需要用双引号 (") 将其括起。

D. 未决问题

本节为非规范性内容。

以下为发布时仍然开放的问题列表。

Issue 108:考虑通过引用方式指定上下文并附带元数据 defer-future-versionprivacy-trackersecurity-tracker

考虑通过引用方式指定上下文并附带元数据。

Issue 191:为非平凡的前缀术语定义提供 Compact IRI 展开支持 defer-future-versionspec:enhancement

为非平凡的前缀术语定义提供 Compact IRI 展开支持。

Issue 280:language-maps 不允许单独的基准方向 defer-future-version

language-maps 不允许单独指定基准方向。

Issue 328:JSON-LD 核心语法中 @context 内的 @default defer-future-version

@context 中的 @default(关于 JSON-LD 核心语法)。

Issue 329:关于 @prefix 的建议 defer-future-version

关于 @prefix 的建议。

Issue 335:类型强制 / 节点转换:@coerce 关键字或类似方案 defer-future-version

类型强制 / 节点转换:@coerce 关键字或类似方案。

E. 自 2014 年 1 月 16 日 1.0 推荐以来的变更

本节为非规范性内容。

另外,请参见 § F. 自 JSON-LD 社区小组最终报告以来的变更

F. 自 JSON-LD 社区小组最终报告以来的变更

本节为非规范性内容。

G. 自 2019 年 12 月 12 日 候选发布以来的变更

本节为非规范性内容。

H. 自 2020 年 5 月 7 日建议推荐发布以来的变更

本节为非规范性内容。

I. 致谢

本节为非规范性内容。

编辑特别感谢以下个人为本规范的撰写和编辑做出重大贡献:

此外,发布时以下人员为工作组成员:

衷心感谢 JSON-LD Community Group 的参与者,他们在邮件列表和每周电话会议中讨论并解决了许多技术问题: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。

J. 参考文献

J.1 规范性参考文献

[BCP47]
Tags for Identifying Languages. A. Phillips; M. Davis. IETF. September 2009. IETF Best Current Practice. URL: https://tools.ietf.org/html/bcp47
[DOM]
DOM Standard. Anne van Kesteren. WHATWG. Living Standard. URL: https://dom.spec.whatwg.org/
[ECMASCRIPT]
ECMAScript Language Specification. Ecma International. URL: https://tc39.es/ecma262/
[HTML]
HTML Standard. Anne van Kesteren; Domenic Denicola; Ian Hickson; Philip Jägenstedt; Simon Pieters. WHATWG. Living Standard. URL: https://html.spec.whatwg.org/multipage/
[IANA-URI-SCHEMES]
Uniform Resource Identifier (URI) Schemes. IANA. URL: https://www.iana.org/assignments/uri-schemes/uri-schemes.xhtml
[JSON]
The application/json Media Type for JavaScript Object Notation (JSON). D. Crockford. IETF. July 2006. Informational. URL: https://tools.ietf.org/html/rfc4627
[JSON-LD10]
JSON-LD 1.0. Manu Sporny; Gregg Kellogg; Marcus Langhaler. W3C. 16 January 2014. W3C Recommendation. URL: https://www.w3.org/TR/2014/REC-json-ld-20140116/
[JSON-LD11-API]
JSON-LD 1.1 Processing Algorithms and API. Gregg Kellogg; Dave Longley; Pierre-Antoine Champin. W3C. 7 May 2020. W3C Proposed Recommendation. URL: https://www.w3.org/TR/json-ld11-api/
[JSON-LD11-FRAMING]
JSON-LD 1.1 Framing. Dave Longley; Gregg Kellogg; Pierre-Antoine Champin. W3C. 7 May 2020. W3C Proposed Recommendation. URL: https://www.w3.org/TR/json-ld11-framing/
[RDF-SCHEMA]
RDF Schema 1.1. Dan Brickley; Ramanathan Guha. W3C. 25 February 2014. W3C Recommendation. URL: https://www.w3.org/TR/rdf-schema/
[RDF11-CONCEPTS]
RDF 1.1 Concepts and Abstract Syntax. Richard Cyganiak; David Wood; Markus Lanthaler. W3C. 25 February 2014. W3C Recommendation. URL: https://www.w3.org/TR/rdf11-concepts/
[RDF11-MT]
RDF 1.1 Semantics. Patrick Hayes; Peter Patel-Schneider. W3C. 25 February 2014. W3C Recommendation. URL: https://www.w3.org/TR/rdf11-mt/
[RFC2119]
Key words for use in RFCs to Indicate Requirement Levels. S. Bradner. IETF. March 1997. Best Current Practice. URL: https://tools.ietf.org/html/rfc2119
[RFC3986]
Uniform Resource Identifier (URI): Generic Syntax. T. Berners-Lee; R. Fielding; L. Masinter. IETF. January 2005. Internet Standard. URL: https://tools.ietf.org/html/rfc3986
[RFC3987]
Internationalized Resource Identifiers (IRIs). M. Duerst; M. Suignard. IETF. January 2005. Proposed Standard. URL: https://tools.ietf.org/html/rfc3987
[RFC4288]
Media Type Specifications and Registration Procedures. N. Freed; J. Klensin. IETF. December 2005. Best Current Practice. URL: https://tools.ietf.org/html/rfc4288
[RFC5234]
Augmented BNF for Syntax Specifications: ABNF. D. Crocker, Ed.; P. Overell. IETF. January 2008. Internet Standard. URL: https://tools.ietf.org/html/rfc5234
[RFC6839]
Additional Media Type Structured Syntax Suffixes. T. Hansen; A. Melnikov. IETF. January 2013. Informational. URL: https://tools.ietf.org/html/rfc6839
[RFC6906]
The 'profile' Link Relation Type. E. Wilde. IETF. March 2013. Informational. URL: https://tools.ietf.org/html/rfc6906
[RFC7231]
Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content. R. Fielding, Ed.; J. Reschke, Ed. June 2014. Proposed Standard. URL: https://tools.ietf.org/html/rfc7231
[RFC8174]
Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words. B. Leiba. IETF. May 2017. Best Current Practice. URL: https://tools.ietf.org/html/rfc8174
[RFC8259]
The JavaScript Object Notation (JSON) Data Interchange Format. T. Bray, Ed.. IETF. December 2017. Internet Standard. URL: https://tools.ietf.org/html/rfc8259
[RFC8288]
Web Linking. M. Nottingham. October 2017. Proposed Standard. URL: https://tools.ietf.org/html/rfc8288
[UAX9]
Unicode Bidirectional Algorithm. Mark Davis; Aharon Lanin; Andrew Glass. Unicode Consortium. 12 February 2020. Unicode Standard Annex #9. URL: https://www.unicode.org/reports/tr9/tr9-42.html
[UNICODE]
The Unicode Standard. Unicode Consortium. URL: https://www.unicode.org/versions/latest/

J.2 信息性参考文献

[fingerprinting-guidance]
Mitigating Browser Fingerprinting in Web Specifications. Nick Doty. W3C. 28 March 2019. W3C Note. URL: https://www.w3.org/TR/fingerprinting-guidance/
[INFRA]
Infra Standard. Anne van Kesteren; Domenic Denicola. WHATWG. Living Standard. URL: https://infra.spec.whatwg.org/
[JSON.API]
JSON API. Steve Klabnik; Yehuda Katz; Dan Gebhardt; Tyler Kellen; Ethan Resnick. 29 May 2015. unofficial. URL: https://jsonapi.org/format/
[ld-glossary]
Linked Data Glossary. Bernadette Hyland; Ghislain Auguste Atemezing; Michael Pendleton; Biplav Srivastava. W3C. 27 June 2013. W3C Note. URL: https://www.w3.org/TR/ld-glossary/
[LINKED-DATA]
Linked Data Design Issues. Tim Berners-Lee. W3C. 27 July 2006. W3C-Internal Document. URL: https://www.w3.org/DesignIssues/LinkedData.html
[MICRODATA]
HTML Microdata. Charles 'chaals' (McCathie) Nevile; Dan Brickley; Ian Hickson. W3C. 26 April 2018. W3C Working Draft. URL: https://www.w3.org/TR/microdata/
[RDFA-CORE]
RDFa Core 1.1 - Third Edition. Ben Adida; Mark Birbeck; Shane McCarron; Ivan Herman et al. W3C. 17 March 2015. W3C Recommendation. URL: https://www.w3.org/TR/rdfa-core/
[rfc4122]
A Universally Unique IDentifier (UUID) URN Namespace. P. Leach; M. Mealling; R. Salz. IETF. July 2005. Proposed Standard. URL: https://tools.ietf.org/html/rfc4122
[RFC7049]
Concise Binary Object Representation (CBOR). C. Bormann; P. Hoffman. IETF. October 2013. Proposed Standard. URL: https://tools.ietf.org/html/rfc7049
[RFC7946]
The GeoJSON Format. H. Butler; M. Daly; A. Doyle; S. Gillies; S. Hagen; T. Schaub. IETF. August 2016. Proposed Standard. URL: https://tools.ietf.org/html/rfc7946
[RFC8785]
JSON Canonicalization Scheme (JCS). A. Rundgren; B. Jordan; S. Erdtman. Network Working Group. June 2020. Informational. URL: https://www.rfc-editor.org/rfc/rfc8785
[SPARQL11-OVERVIEW]
SPARQL 1.1 Overview. The W3C SPARQL Working Group. W3C. 21 March 2013. W3C Recommendation. URL: https://www.w3.org/TR/sparql11-overview/
[SRI]
Subresource Integrity. Devdatta Akhawe; Frederik Braun; Francois Marier; Joel Weinberger. W3C. 23 June 2016. W3C Recommendation. URL: https://www.w3.org/TR/SRI/
[string-meta]
Strings on the Web: Language and Direction Metadata. Addison Phillips; Richard Ishida. W3C. 11 June 2019. W3C Working Draft. URL: https://www.w3.org/TR/string-meta/
[TriG]
RDF 1.1 TriG. Gavin Carothers; Andy Seaborne. W3C. 25 February 2014. W3C Recommendation. URL: https://www.w3.org/TR/trig/
[Turtle]
RDF 1.1 Turtle. Eric Prud'hommeaux; Gavin Carothers. W3C. 25 February 2014. W3C Recommendation. URL: https://www.w3.org/TR/turtle/
[URN]
URN Syntax. R. Moats. IETF. May 1997. Proposed Standard. URL: https://tools.ietf.org/html/rfc2141
[WEBIDL]
Web IDL. Boris Zbarsky. W3C. 15 December 2016. W3C Editor's Draft. URL: https://heycam.github.io/webidl/
[YAML]
YAML Ain’t Markup Language (YAML™) Version 1.2. Oren Ben-Kiki; Clark Evans; Ingy döt Net. 1 October 2009. URL: http://yaml.org/spec/1.2/spec.html