JSON-LD 1.1 框架化

JSON-LD 语法应用程序编程接口的扩展

W3C 推荐标准

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

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

另请参阅 翻译

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


摘要

JSON-LD 框架化允许开发者按示例查询,并 强制为 JSON-LD 文档采用特定的树布局。

本规范描述了 JSON-LD 框架化 1.0 [JSON-LD10-FRAMING] 中定义功能的超集,并且除非另有说明, 本规范中描述的算法与使用先前社区标准创建的 文档完全兼容。

本文档状态

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

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

有一个 实时 JSON-LD 演练场,能够 演示本文档中描述的功能。

本文档由 JSON-LD 工作组 作为 推荐标准发布。

首选使用 GitHub Issues 讨论本规范。 或者,你可以向我们的邮件列表发送评论。 请将评论发送至 public-json-ld-wg@w3.org归档)。

请参阅工作组的 实现报告

本文档已由 W3C 成员、软件开发者以及其他 W3C 组和相关方审查,并由总监认可为 W3C 推荐标准。它是一份稳定文档,可用作 参考资料或被其他文档引用。W3C 制定 推荐标准的作用是引起人们对规范的关注,并促进其 广泛部署。这增强了 Web 的功能和互操作性。

本文档由一个根据 W3C 专利政策运作的组制作。 W3C 维护一份 与该组交付成果相关的任何专利 披露的公开列表; 该页面还包括披露专利的说明。任何实际知晓某项专利, 并认为该专利包含 必要权利要求 的个人,必须按照 W3C 专利政策第 6 节披露相关信息。

本文档受 2019 年 3 月 1 日 W3C 流程文档约束。

文档集

本文档是 JSON-LD 工作组生成的三份 JSON-LD 1.1 推荐标准之一:

1. 介绍

本节为非规范性内容。

JSON-LD 是一种轻量级语法,用于在 JSON [RFC8259] 中序列化关联数据 [LINKED-DATA]。 它的设计允许以最少的改动将现有 JSON 解释为关联数据。 与其他描述有向图的关联数据表示形式一样, 单个有向图可以有许多不同的序列化形式,每一种都表达 完全相同的信息。开发者通常使用树结构,即表示为 JSON 对象。虽然可以将 图映射到 树,但最终结果的布局必须预先指定。 开发者可以在 JSON-LD 文档上使用框架,为图 指定确定性的布局。

使用分隔符包围一块数据称为“框架化”。 JSON-LD 使用 JSON 分隔符,例如 {}, 来分隔关于特定主体的陈述。JSON-LD 还允许主体 通过使用其标识符来引用其他主体,这些标识符表示为 字符串。

然而,由于 JSON-LD 表示一个或多个信息, 因此把关于若干相关 主体的陈述框架化为一个完整文档的方式不止一种。实际上,信息图可以 被看作一长串彼此独立的陈述(亦称三元组),它们并未以任何方式 捆绑在一起。

JSON-LD 框架化 API 使开发者能够准确指定他们希望数据如何被框架化, 从而将关于特定主体的陈述捆绑在一起, 通过 {} 分隔,并使与其 相关的主体“嵌套”到符合其应用程序预期的特定树结构中。

1.1 如何阅读本文档

本节为非规范性内容。

本文档是关于在 JSON 中序列化关联 数据的详细规范。本文档主要面向以下读者:

配套文档 JSON-LD 1.1 规范 [JSON-LD11] 规定了 JSON-LD 文档的语法。

要理解本规范中的基础内容,必须先熟悉 JSON,它在 [RFC8259] 中有详细说明。 还必须理解 JSON-LD 1.1 语法规范 [JSON-LD11], 它是本文档中所有算法所使用的基础语法, 以及 JSON-LD 1.1 API [JSON-LD11-API]。 要理解 API 及其在编程环境中的预期运行方式, 具备 JavaScript 编程语言 [ECMASCRIPT] 和 WebIDL [WEBIDL] 的实际知识会很有帮助。 要理解 JSON-LD 如何映射到 RDF,熟悉 基本 RDF 概念 [RDF11-CONCEPTS] 会很有帮助。

本文档可以突出显示自 JSON-LD 1.0 版本以来的变更。 选择以 变更。

1.2 贡献

本节为非规范性内容。

可以通过多种方式参与 本规范的开发:

1.3 排版约定

本节为非规范性内容。

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

markup
标记(元素、属性、特性)、 机器可处理值(字符串、字符、媒体类型)、 特性名称, 或文件名使用红橙色等宽字体。
variable
伪代码或算法描述中的变量使用斜体。
定义
术语定义用于本文档或其他规范中的其他位置, 使用粗斜体。
定义引用
本文档中定义的引用 带下划线,并且也是指向定义本身的活动链接。
标记定义引用
本文档中定义的引用, 当引用本身也是标记时,带下划线, 使用红橙色等宽字体,并且也是指向定义本身的活动链接。
外部定义引用
另一文档中定义的引用 带下划线,使用斜体,并且也是指向定义本身的活动链接。
标记外部定义引用
另一文档中定义的引用, 当引用本身也是标记时, 带下划线,使用斜体红橙色等宽字体, 并且也是指向定义本身的活动链接。
超链接
超链接带下划线并显示为蓝色。
[参考文献]
文档参考文献(规范性或资料性)用方括号括起, 并链接到参考文献部分。
自推荐标准以来的变更
自上一推荐标准以来变更的章节或短语 可以使用 § 1.1 如何阅读本文档中的控件 以突出显示

注以浅绿色框显示,左边框为绿色,并带有绿色的“注”标题。 注始终是资料性的。

示例以浅卡其色框显示,左边框为卡其色,
并带有卡其色的编号“示例”标题。
示例始终是资料性的。示例内容使用等宽字体,并且可能带有语法着色。

示例可以带有标签式导航按钮,
用于显示将示例转换为其他表示形式后的结果。

1.4 术语

本文档使用外部规范中定义的以下术语, 并定义 JSON-LD 专用术语。

从其他规范导入的术语

ECMAScript 语言 规范 [ECMASCRIPT]、 JavaScript 对象表示法(JSON)数据 交换格式 [RFC8259]、 Infra 标准 [INFRA] 和 Web IDL [WEBIDL] 导入的术语

数组
在 JSON 序列化中, 数组结构表示为 用方括号包围的零个或多个值。 值之间用逗号分隔。 在内部 表示中, 列表(也称为数组)是由零个或多个值组成的 有序集合。 虽然 JSON-LD 使用与 JSON 相同的数组表示形式, 但默认情况下该集合是无序的。 虽然普通 JSON 数组会保留顺序, 但普通 JSON-LD 数组不会保留顺序,除非专门定义 (参见 JSON-LD 1.1 的集合和列表 章节)。
布尔值
用于表达两种可能状态之一的值 truefalse
JSON 对象
在 JSON 序列化中, 对象结构 表示为一对花括号,包围零个或多个名称/值对(或 成员)。 名称是字符串。 每个名称后有一个冒号, 用于将名称和值分隔开。 单个逗号将一个值与后续名称分隔开。 在 JSON-LD 中,对象中的名称必须唯一。

内部 表示中,JSON 对象被描述为 映射 (参见 [INFRA]), 由带有键/值对的 条目组成。

应用程序 编程接口中, 映射 使用 [WEBIDL] record 描述。

null
在 JSON-LD 中使用 null 值用于忽略或重置值。 在 @context 中,如果某个映射条目的值, 或该值的 @idnull, 则显式解除术语与 IRI 的关联。 在 JSON-LD 文档主体中, 值为 null映射条目 与该映射条目未定义具有相同含义。 如果在展开形式中将 @value@list@set 设置为 null, 则整个 JSON 对象会被忽略。
数字
在 JSON 序列化中,数字 与大多数编程语言中使用的数字类似, 不同之处在于不使用八进制和十六进制格式,并且不允许 前导零。 在内部 表示中, 数字 等价于 longdouble, 具体取决于该数字是否具有非零小数部分(参见 [WEBIDL])。
标量
标量可以是字符串数字truefalse
字符串
字符串 是由零个或多个 Unicode(UTF-8)字符组成的序列, 用双引号包围,并在必要时使用反斜杠转义。 字符表示为单字符字符串。

国际化 资源标识符(IRI) [RFC3987] 导入的术语

IRI
IRI 的绝对形式,包含一个 方案以及一个路径, 还可选包含查询片段段。
IRI 引用
表示国际化资源 标识符的常见用法。 IRI 引用可以是 绝对的,也可以是 相对的。 然而,由这种引用产生的“IRI” 只包含绝对 IRI; 任何相对 IRI 引用都会 解析为其绝对形式。
相对 IRI 引用
相对 IRI 引用是相对于某个其他 IRI 引用IRI, 通常是文档的基准 IRI。 请注意,属性@type 的值, 以及定义为词汇表相对术语的值 都相对于词汇表映射解析, 而不是相对于基准 IRI解析。

RDF 1.1 概念和 抽象语法 [RDF11-CONCEPTS]、RDF Schema 1.1 [RDF-SCHEMA] 和 关联数据设计 问题 [LINKED-DATA] 导入的术语

基准 IRI
基准 IRI是在上下文中建立的 IRI, 或者基于 JSON-LD 文档 的位置。 基准 IRI用于将相对 IRI 引用转换为IRI
空白 节点
中的一个 节点, 它既不是 IRI, 也不是字面量空白 节点不包含 可解引用的标识符,因为它本质上是临时的, 或者不包含需要从关联 数据图外部链接到的信息。 在 JSON-LD 中, 空白节点会被分配一个以 _: 前缀开头的标识符。
空白节点 标识符
空白节点 标识符 是一个字符串,可用作 JSON-LD 文档范围内 空白节点的标识符。 空白节点标识符以 _: 开头。
数据集
数据集 表示一个 RDF 图集合, 其中恰好包含一个默认图和 零个或多个命名图
数据类型 IRI
数据类型 IRI是一个IRI,用于标识某种数据类型, 该数据类型确定词法形式如何映射到 字面量值
默认 图
数据集默认图是一个没有名称RDF 图,它可以为空。
图名称
用于标识命名图IRI空白 节点
带语言标签的 字符串
带语言标签的 字符串 由字符串和非空语言标签组成, 如 [BCP47] 所定义。 语言标签 必须根据 [BCP47] 的 第 2.2.9 节 一致性类别 是格式良好的。 处理器可以将语言标签规范化为 小写。
关联 数据
一组文档,每个文档都包含关联数据图数据集的表示形式。
列表
列表是由 IRI空白节点字面量组成的有序序列。
字面量
字符串数字 等值表示的对象。 隐式或显式包含一个数据类型 IRI,并且如果数据类型是 rdf:langString,则可选包含一个语言标签
命名 图
命名 图 是由 IRI空白 节点标识的关联数据图
节点
RDF 图中的一个节点, 可以是至少一个三元组主体对象。 请注意,一个节点可以在一个中扮演两个角色(主体对象), 甚至在同一个三元组中也可以如此。
对象
对象关联 数据图中的一个节点, 至少有一条传入边。
属性
关联数据图中有向弧的名称。 每个属性都是有方向的, 并标记有一个IRI或一个空白节点 标识符。 只要可能,属性就应标记为一个 IRI
使用空白 节点标识符来标记属性已过时, 并且可能会在 JSON-LD 的未来版本中移除。
另请参见 [RDF11-CONCEPTS] 中的 谓词
RDF 图
一个带标签的有向, 即一组通过有向弧连接的节点。 也称为关联数据图
资源
IRI空白 节点字面量表示的资源, 代表世界中的某种事物(“论域”)。
主体
主体关联 数据图中的一个节点, 至少有一条传出边, 通过属性对象节点相关联。
三元组
RDF 图的一个组成部分,包含主体谓词对象, 它表示 RDF 图的一个节点-弧-节点片段。

JSON-LD 专用术语定义

活动上下文
用于在处理算法运行时解析术语上下文
基准方向
基准 方向是在字符串本身没有关联方向时使用的方向。 它可以在上下文中使用 @direction 键来设置, 其值必须是字符串 "ltr""rtl"null 之一。 有关规范性描述,参见 JSON-LD 1.1 的上下文 定义章节。
上下文
一组规则,用于按 JSON-LD 1.1 的 The Context 章节所述解释 JSON-LD 文档, 并在 JSON-LD 1.1 的上下文定义 章节中进行规范性规定。
默认对象
默认 对象是一个具有 @default 键的映射
框架
一个JSON-LD 文档, 它描述了使用匹配和嵌入规则转换另一个JSON-LD 文档的形式。 框架文档允许额外关键字和某些映射条目 来描述匹配和转换过程。
框架 对象
框架对象是映射元素,位于一个框架内, 表示框架中匹配输入中的 节点 对象值对象 的特定部分。 有关规范性描述,参见 JSON-LD 1.1 的框架对象章节。
JSON-LD 文档
JSON-LD 文档RDF 数据集的序列化。 有关形式化描述,参见 JSON-LD 1.1 中的 JSON-LD 语法 章节。
JSON-LD 内部表示
JSON-LD 内部表示 是将 JSON 语法结构转换为适合直接处理的核心数据结构后的结果: 数组映射字符串数字布尔值null
JSON-LD 处理器
JSON-LD 处理器 是一个能够执行 JSON-LD 1.1 处理算法和 API 中定义算法的系统。 有关形式化描述,参见 JSON-LD 1.1 API 中的一致性章节。
JSON-LD 值
JSON-LD 值字符串数字truefalse类型化 值, 或带语言标签的 字符串。 它表示一个 RDF 字面量
关键字
一种特定于 JSON-LD 的字符串, 在 JSON-LD 1.1 的语法记号和 关键字章节中描述, 并在 JSON-LD 1.1 的关键字章节中规范性规定,
节点 对象
节点 对象表示由 JSON-LD 文档序列化的 中某个节点的 零个或多个属性。 如果一个映射 存在于 JSON-LD 上下文之外,并且:
  • 它不包含 @value@list@set 关键字,或者
  • 它不是 JSON-LD 文档中最顶层的映射, 该映射除 @graph@context 之外不包含其他条目
则它是一个节点 对象节点 对象中键不是关键字的条目 也称为该节点 对象属性。 有关规范性描述,参见 JSON-LD 1.1 的节点对象章节。
节点引用
用于引用仅具有 @id 键的节点的节点 对象
处理 模式
处理模式定义 如何处理JSON-LD 文档。 默认情况下,所有文档都假定符合本规范。 通过在上下文中使用 @version 条目定义不同版本, 发布者可以确保符合 JSON-LD 1.0 [JSON-LD10] 的处理器不会意外处理 JSON-LD 1.1 文档,从而可能产生不同的输出。 API 提供了一个选项,用于将处理模式设置为 json-ld-1.0, 这将阻止 JSON-LD 1.1 功能被激活, 或者在上下文中的 @version 条目显式设置为 1.1 时产生错误。 本规范通过 json-ld-1.1 处理模式 扩展 JSON-LD 1.0
作用域上下文
作用域 上下文是使用 @context 条目展开术语 定义的一部分。其形式与嵌入式上下文相同。 当术语用作类型时,它定义一个类型作用域 上下文; 当用作属性时,它定义一个属性作用域 上下文
类型化值
类型化 值由一个值和一个类型组成, 其中值是字符串, 类型是一个IRI
值 对象
值 对象是一个映射,其中具有 @value 条目。 有关规范性描述,参见 JSON-LD 1.1 的值对象章节。
词汇表 映射
词汇表映射是在上下文中使用 @vocab 键设置的, 其值必须是一个IRI、一个紧凑 IRI、一个术语null。 有关规范性描述,参见 JSON-LD 1.1 的上下文 定义章节。

1.4.1 算法术语

以下术语用于特定算法中。

活动 属性
处理器在处理时应使用的当前活动属性关键字活动属性 以原始词法形式表示, 该形式用于在活动上下文中查找强制转换映射。
显式包含标志
一个标志,指定要包含在输出中的属性 必须在匹配的框架中显式声明。
框架化状态
一个映射, 包含以下各项的值: 对象嵌入 标志要求全部 标志嵌入标志, 在内部用于帮助确定对象嵌入是否适当, 显式 包含标志、 以及省略 默认值标志
输入框架
提供给框架化算法的初始框架
IRI 压缩
在各种算法中用作宏,以减少用于描述如下过程的语言: 使用直接指定的,或来自使用此术语的算法步骤作用域中的 active context, 对表示 IRI关键字字符串 var 进行压缩。 如果显式提供,则使用可选的 value。 除非另有指定,vocab 标志默认为 truereverse 标志默认为 false
  1. 返回使用 IRI 压缩 算法的结果, 传入 active contextvarvalue(如果提供)、 vocabresult
JSON-LD 输入
提供给算法作为输入的 JSON-LD 数据结构。
扁平化主体映射
节点映射生成 算法产生的主体映射。
对象嵌入标志
一个标志,指定节点对象应直接嵌入到输出中, 而不是由其IRI引用。
省略默认值标志
一个标志,指定那些在JSON-LD 输入中缺失, 但存在于输入 框架中的属性 应从输出中省略。
省略图标志
一个标志,用于确定框架化输出是否始终包含在 @graph 条目中, 或仅在需要表示多个节点对象时才如此。
要求全部标志
一个标志,指定输入框架中存在的所有属性 必须要么具有默认值, 要么存在于JSON-LD 输入中, 框架才能匹配。

1.5 语法记号和关键字

本规范向 JSON-LD 1.1 语法规范 [JSON-LD11] 中定义的 关键字添加若干 关键字(框架化关键字):

@default
用于框架化中,为输出属性设置默认值, 当被框架化的节点对象不包含此类 属性时使用。
@embed
用于框架化中,在特定框架内覆盖 对象嵌入 标志的值。@embed 的有效值如下:
@always
始终将节点对象作为属性 值嵌入,除非这会 导致循环引用。
@once
在给定节点对象中只应嵌入 单个值, 其他属性的其他值使用节点引用。如果既未指定 @embed,也未指定对象嵌入标志, 则这是默认值。
所选择用于嵌入的具体节点对象 取决于顺序。如果 ordered 标志为 true, 则将是遇到的第一个节点对象, 否则,它可以是任意节点对象。
@never
在序列化匹配值时,始终使用节点引用

@embed 的任何其他值都是无效的,并表示检测到 invalid @embed value 错误,处理将中止。

@explicit
用于框架化中,在特定框架内覆盖 显式 包含标志的值。
@null
用于框架化中,当应返回 null 值时使用;否则该值会在 压缩时被移除。
@omitDefault
用于框架化中,在特定框架内覆盖 省略默认值 标志的值。
@requireAll
用于框架化中,在特定框架内覆盖 要求全部 标志的值。

所有 JSON-LD 记号和关键字都区分大小写。

2. 功能

本节为非规范性内容。

JSON-LD 1.1 引入了与 JSON-LD 1.0 [JSON-LD10] 兼容的新功能, 但如果由 JSON-LD 1.0 处理器处理,可能会产生不同结果。 处理器默认使用 json-ld-1.1,除非 processingMode API 选项 被显式设置为 json-ld-1.0。 鼓励发布者在上下文中使用 设置为 1.1@version 映射条目, 以确保 JSON-LD 1.0 处理器不会误解 JSON-LD 1.1 功能。

2.1 框架化

本节为非规范性内容。

框架化用于塑造 JSON-LD 文档中的数据, 它使用一个示例框架文档,该文档既用于匹配 扁平化 数据,也用于展示生成的数据应如何成形的示例。 匹配通过使用属性来执行,这些属性存在于框架中, 用于查找数据中共享公共值的对象。匹配可以 使用框架中存在的全部属性,也可以使用框架中的任意属性。 通过使用匹配的属性值将对象串联起来,对象可以彼此 嵌入。

框架还包括一个上下文,用于 压缩生成的框架化输出。

例如,假设有以下 JSON-LD 框架:

示例 2:示例图书馆框架
{
  "@context": {"@vocab": "http://example.org/"},
  "@type": "Library",
  "contains": {
    "@type": "Book",
    "contains": {
      "@type": "Chapter"
    }
  }
}

框架文档描述了一种 嵌入结构,它会将类型为 Library 的 对象置于顶部,将使用 contains 属性链接到图书馆对象的 Book 类型对象作为属性值嵌入。它还会 将 Chapter 类型对象放入引用它的 Book 对象中, 作为该 Book 对象的嵌入值。

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

示例 3:扁平化图书馆对象
{
  "@context": {
    "@vocab": "http://example.org/",
    "contains": {"@type": "@id"}
  },
  "@graph": [{
    "@id": "http://example.org/library",
    "@type": "Library",
    "location": "Athens",
    "contains": "http://example.org/library/the-republic"
  }, {
    "@id": "http://example.org/library/the-republic",
    "@type": "Book",
    "creator": "Plato",
    "title": "The Republic",
    "contains": "http://example.org/library/the-republic#introduction"
  }, {
    "@id": "http://example.org/library/the-republic#introduction",
    "@type": "Chapter",
    "description": "An introductory chapter on The Republic.",
    "title": "The Introduction"
  }]
}

框架算法可以创建一个符合该框架结构的新文档:

如果处理 模式不是 json-ld-1.0,或者省略图标志true, 则可以省略顶层 @graph 条目

示例 5:框架化图书馆对象
{
  "@context": {"@vocab": "http://example.org/"},
  "@id": "http://example.org/library",
  "@type": "Library",
  "location": "Athens",
  "contains": {
    "@id": "http://example.org/library/the-republic",
    "@type": "Book",
    "creator": "Plato",
    "title": "The Republic",
    "contains": {
      "@id": "http://example.org/library/the-republic#introduction",
      "@type": "Chapter",
      "description": "An introductory chapter on The Republic.",
      "title": "The Introduction"
    }
  }
}

框架化算法通过以下方式完成此操作: 首先展开输入框架和文档。然后创建一个 扁平化主体映射。 框架中最外层的节点对象 用于匹配映射中的对象,在本例中是查找节点对象, 这些节点对象具有 @typeLibrary,并且具有 contains 属性,其值使用另一个 框架来匹配该属性的值。输入文档恰好包含 一个这样的节点 对象。contains 的值也有 一个节点对象,随后 它被当作框架来匹配作为 Library 对象的 contains 值的主体集合,依此类推。

2.1.1 按属性匹配

本节为非规范性内容。

除了按类型匹配之外,框架还可以按 一个或多个属性进行匹配。

例如,以下框架基于属性 值而不是 @type 来选择对象。

示例 6:带属性匹配的图书馆框架
{
  "@context": {"@vocab": "http://example.org/"},
  "location": "Athens",
  "contains": {
    "title": "The Republic",
    "contains": {
      "title": "The Introduction"
    }
  }
}

这将生成与按 @type 选择时相同的框架化结果, 因为这些属性值对每个节点对象都是唯一的。

参见 § 2.3.5 要求全部标志, 以了解如何将匹配限制为匹配包含 全部列出属性或任意此类列出属性的节点对象

2.1.2 通配符匹配

本节为非规范性内容。

映射{})被用作通配符,如果属性存在于目标节点对象中,它就会匹配该属性, 而不依赖任何特定值。

例如,以下框架基于属性 通配符而不是 @type 来选择对象。

示例 8:带通配符匹配的图书馆框架
{
  "@context": {"@vocab": "http://example.org/"},
  "location": {},
  "contains": {
    "creator": {},
    "contains": {
      "description": {}
    }
  }
}

这将生成与按 @type 选择时相同的框架化结果, 因为匹配的属性对每个节点对象都是不同的。

2.1.3 按属性缺失 匹配

本节为非规范性内容。

数组[])用于不匹配任何值,它只会在目标节点对象中不存在某个属性时 匹配该节点对象。

例如,以下框架基于属性缺失 而不是 @type 来选择对象。

示例 10:带缺失匹配的图书馆框架
{
  "@context": {"@vocab": "http://example.org/"},
  "creator": [],
  "title": [],
  "contains": {
    "location": [],
    "description": [],
    "contains": {
      "location": []
    }
  }
}

这将生成与按 @type 选择时相同的框架化结果, 被排除的属性唯一标识每个节点对象。 请注意,对于那些被显式排除的属性,还会添加值为 null 的附加属性。

2.1.4 按值匹配

本节为非规范性内容。

框架可以基于特定属性值的存在来匹配。 这些值自身可以使用通配符,以匹配特定值 或一组值、语言标签、类型或基准方向

作为示例,我们将使用图书馆示例的一个多语言版本, 其中包含更复杂的值表示。

示例 12:多语言图书馆对象
{
  "@context": {
    "@vocab": "http://example.org/",
    "contains": {"@type": "@id"}
  },
  "@graph": [{
    "@id": "http://example.org/library",
    "@type": "Library",
    "location": [
      {"@value": "Athens", "@language": "en"},
      {"@value": "Αθήνα", "@language": "grc"},
      {"@value": "Athína", "@language": "el-Latn"}
    ],
    "contains": "http://example.org/library/the-republic"
  }, {
    "@id": "http://example.org/library/the-republic",
    "@type": "Book",
    "creator": [
      {"@value": "Plato", "@language": "en"},
      {"@value": "Πλάτων", "@language": "grc"},
      {"@value": "Plátōn", "@language": "el-Latn"}
    ],
    "title": [
      {"@value": "The Republic", "@language": "en"},
      {"@value": "Πολιτεία", "@language": "grc"},
      {"@value": "Res Publica", "@language": "el-Latn"}
    ],
    "contains": "http://example.org/library/the-republic#introduction"
  }, {
    "@id": "http://example.org/library/the-republic#introduction",
    "@type": "Chapter",
    "description": "An introductory chapter on The Republic.",
    "title": "The Introduction"
  }]
}

通过按值的某个属性匹配,我们可以匹配 具有该属性的框架,并将结果限制为 匹配的属性值。在本例中,我们将只按拉丁化希腊语 (el-Latn)中的值来框架化 Library 和 Book 对象:

示例 13:带语言匹配的图书馆框架
{
  "@context": {"@vocab": "http://example.org/"},
  "location": {"@value": {}, "@language": "el-Latn"},
  "contains": {
    "creator": {"@value": {}, "@language": "el-Latn"},
    "title": {"@value": {}, "@language": "el-Latn"},
    "contains": {
      "title": "The Introduction"
    }
  }
}

这会生成以下框架化结果:

2.1.5 @id 匹配

本节为非规范性内容。

如果框架匹配某个特定 标识符(@id),则可以匹配该框架。这可以用原始的 扁平化图书馆对象 输入来说明,并使用一个按特定 @id 值匹配的框架:

示例 15:带 @id 匹配的图书馆框架
{
  "@context": {"@vocab": "http://example.org/"},
  "@id": "http://example.org/library",
  "contains": {
    "@id": "http://example.org/library/the-republic",
    "contains": {
      "@id": "http://example.org/library/the-republic#introduction"
    }
  }
}

这会生成以下框架化结果:

框架也可以从一组标识符中匹配。 在框架内,@id 具有数组值是可以接受的, 其中各个值会被视为 IRI

示例 17:带数组 @id 匹配的图书馆框架
{
  "@context": {"@vocab": "http://example.org/"},
  "@id": ["http://example.org/home", "http://example.org/library"],
  "contains": {
    "@id": ["http://example.org/library/the-republic"],
    "contains": {
      "@id": ["http://example.org/library/the-republic#introduction"]
    }
  }
}

这会生成以下框架化结果:

2.1.6 空框架

本节为非规范性内容。

空框架会匹配任何节点对象,即使这些 对象嵌入在别处,也会导致它们在顶层被序列化。

示例 19: 空框架
{
  "@context": {"@vocab": "http://example.org/"}
}

这会生成以下框架化结果:

2.2 默认内容

本节为非规范性内容。

框架可以指定输入文件中不存在的属性。如果 显式包含 标志false,框架化算法 将向结果添加属性和值。节点对象值对象中的 @default 属性, 或作为 @type 的值, 提供要在生成的 输出文档中使用的默认值。如果没有 @default 值,该属性将以 null 值输出。(参见 § 2.3.3 省略默认值标志 以了解避免这种情况的方法)。

框架中的属性值除此之外不会在输出文档中 使用。它的目的是用于框架匹配和 查找默认值。请注意以下示例中 Librarydescription 值。

示例 21:带 @default 值的示例图书馆框架
{
  "@context": {"@vocab": "http://example.org/"},
  "@type": "Library",
  "description": "A great Library.",
  "contains": {
    "@type": "Book",
    "description": {"@default": "A great book."},
    "contains": {
      "@type": "Chapter"
    }
  }
}

默认值也可以用于 @type,与其他属性类似。 在这种情况下,没有 @type 的匹配节点对象将采用 框架默认 对象的值。 默认 对象具有一个值,该值是单个IRI。 如果指定了多个 IRI, 则只有第一个会用作默认类型。

该框架匹配具有特定属性值的对象, 并为匹配的对象提供 @type 的默认值。

示例 23:带 @default 类型的示例图书馆框架
{
  "@context": {"@vocab": "http://example.org/"},
  "@type": "Library",
  "contains": {
    "@type": {"@default": "Book"},
    "creator": "Plato",
    "contains": {
      "@type": {"@default": "Chapter"},
      "description": "An introductory chapter on The Republic."
    }
  }
}

缺少特定 @type 值的数据,但会基于 其他属性值进行匹配。

示例 24:无类型图书馆对象
{
  "@context": {
    "@vocab": "http://example.org/",
    "contains": {"@type": "@id"}
  },
  "@graph": [{
    "@id": "http://example.org/library",
    "@type": "Library",
    "contains": "http://example.org/library/the-republic"
  }, {
    "@id": "http://example.org/library/the-republic",
    "creator": "Plato",
    "title": "The Republic",
    "contains": "http://example.org/library/the-republic#introduction"
  }, {
    "@id": "http://example.org/library/the-republic#introduction",
    "description": "An introductory chapter on The Republic.",
    "title": "The Introduction"
  }]
}

2.3 框架化标志

本节为非规范性内容。

可以使用API 选项来控制框架化, 或者通过在框架中添加框架化关键字, 如 § 1.5 语法记号和关键字中所述。

使用关键字设置的框架化标志仅对 它们出现的框架,以及为不存在框架对象的对象创建的 隐式框架生效。

2.3.1 对象嵌入标志

本节为非规范性内容。

对象嵌入标志 确定被引用的 节点对象 是作为引用它的 对象的属性值嵌入,还是保留为节点引用对象嵌入标志的初始值使用 embed 选项设置。 请考虑以下框架, 它基于对象嵌入标志的默认 @once 值:

示例 26:隐式 @embed 设置 为 @once 的示例图书馆框架
{
  "@context": {"@vocab": "http://example.org/"},
  "@type": "Library"
}

因为对象嵌入标志的默认值是 @once (此外显式包含标志false), 未列出的属性会被添加到输出中,并使用默认空框架 隐式嵌入。因此,会生成与上面的 框架化图书馆对象相同的输出, 前提是 ordered 标志为 true

但是,如果显式添加 @embed 属性,并将其 值设为 @never,则 BookChapter 的值将被排除。

示例 28:显式 @embed 设置 为 @never 的示例图书馆框架
{
  "@context": {"@vocab": "http://example.org/"},
  "@type": "Library",
  "contains": {
    "@type": "Book",
    "@embed": "@never"
  }
}

为了说明 @once 不展开值的情况, 请考虑一个替代的图书馆示例,其中书籍被双重索引。

示例 30:带双重 索引的扁平化图书馆对象
{
  "@context": {
    "@vocab": "http://example.org/",
    "books": {"@type": "@id"},
    "contains": {"@type": "@id"}
  },
  "@graph": [{
    "@id": "http://example.org/library",
    "@type": "Library",
    "books": "http://example.org/library/the-republic",
    "contains": "http://example.org/library/the-republic"
  }, {
    "@id": "http://example.org/library/the-republic",
    "@type": "Book",
    "creator": "Plato",
    "title": "The Republic",
    "contains": "http://example.org/library/the-republic#introduction"
  }, {
    "@id": "http://example.org/library/the-republic#introduction",
    "@type": "Chapter",
    "description": "An introductory chapter on The Republic.",
    "title": "The Introduction"
  }]
}

当使用具有默认 @embed@once 的同一框架进行框架化时, 如果 ordered 标志为 true, 则只有 "books" 属性会有内容, 而 "contains" 属性会使用引用。

如果我们使用带有 "@embed": "@always" 的框架, 则两个属性都将包含展开的值。

示例 32:显式 @embed 设置 为 @always 的示例图书馆框架
{
  "@context": {"@vocab": "http://example.org/"},
  "@type": "Library",
  "@embed": "@always"
}

2.3.2 显式包含标志

本节为非规范性内容。

显式 包含标志用于确定 哪些属性将包含在输出文档中。 默认值为 false,这意味着输入节点对象中存在但不在 关联框架中的属性将被 包含在输出对象中。 如果为 true,则只有输入框架中存在的 属性会被放入输出。 显式包含标志的初始值使用 explicit 选项设置。

例如,取一个扩展版的图书馆框架,其中包含 输入中的一些属性,但省略其他属性。

示例 34:@explicit 设置为 true 的示例图书馆框架
{
  "@context": {"@vocab": "http://example.org/"},
  "@type": "Library",
  "description": {},
  "contains": {
    "@type": "Book",
    "@explicit": true,
    "title": {},
    "contains": {
      "@type": "Chapter"
    }
  }
}

生成的输出将排除 Book 中未在框架对象中 显式列出的属性:

请注意,Library 对象包含一个 null description 属性,因为它在框架中使用 "description": {} 被显式请求。creator 属性 不存在于输出中,因为它不是显式的。

2.3.3 省略默认值标志

本节为非规范性内容。

省略默认值标志 改变了当框架中描述的属性 不存在于输入文档中时,框架化生成输出的方式。 省略默认值标志的初始值使用 omitDefault 选项设置。 进一步讨论见 § 2.2 默认内容

请考虑以下输入文档:

示例 36:示例父/子关系数据
{
  "@context": {
    "@vocab": "http://example.org/",
    "child": {"@type": "@id"}
  },
  "@graph": [{
    "@id": "http://example.org#John",
    "@type": "Person",
    "name": "John",
    "child": "http://example.org#Jane"
  }, {
    "@id": "http://example.org#Jane",
    "@type": "Person",
    "name": "Jane"
  }]
}

为了说明省略默认值标志的有用之处,请考虑以下 不使用 @omitDefault 的框架:

示例 37:不带 @omitDefault 的示例父/子关系框架
{
  "@context": {
    "@vocab": "http://example.org/",
    "child": {"@type": "@id"}
  },
  "@type": "Person",
  "child": {
    "@embed": "@always"
  }
}

生成的输出将包含一个值为 null 的 "child" 属性,这可能并不总是期望的:

请注意,由于在框架中 child 属性下指定了 "@embed": "@always" 选项, 因此对于不具有该属性的匹配项,输出中会出现 "child": null,这可能是不希望的。 为了阻止这种默认 null 输出出现, 可以像这样将 @omitDefault 设置为 true:

示例 39:带 @omitDefault 的示例父/子关系框架
{
  "@context": {
    "@vocab": "http://example.org/",
    "child": {"@type": "@id"}
  },
  "@type": "Person",
  "child": {
    "@embed": "@always",
    "@omitDefault": true
  }
}

这会产生以下(期望的)输出:

2.3.4 省略图标志

本节为非规范性内容。

省略图标志 确定包含单个 节点对象的框架化输出 是否包含在 @graph 中。 省略图标志的初始值使用 omitGraph 选项设置,或者基于 处理 模式;如果处理模式json-ld-1.0,则输出 始终包含一个 @graph 条目;否则,@graph 条目仅用于 描述多个节点对象,这与 压缩保持一致。 进一步讨论见 § 4.1 框架化算法

结果与原始的扁平化图书馆 对象示例相同, 但顶层有一个 @graph示例 5 显示了 省略图标志 设置为 true 时的结果,这是当 处理 模式设置为默认 json-ld-1.1 时的默认值。 通过将处理 模式设置为 json-ld-1.0, 或将省略图 标志设置为 false,可以将顶层对象包裹在 @graph 中。

2.3.5 要求全部标志

本节为非规范性内容。

要求全部标志 用于框架匹配中,以确定输入文档中的 节点对象何时 匹配某个框架。匹配时, 对象可以包含 @type 和其他 属性;如果要求 全部标志的值为 false(默认值), 则当对象中的任意属性值匹配 框架对象中的 节点模式时即构成匹配。 如果该标志值为 true,则框架 对象中的所有 属性都必须存在于节点 对象中,节点才会匹配。

以下框架按多个属性匹配,包括某个属性的缺失。 使用扁平化图书馆对象示例, 我们可以匹配同时包含 title 和 description 或 title 和 creator 属性的对象。 如果我们使用设置为 false@requireAll,则可以按 任意属性的存在进行匹配,而不是所有属性都必须存在。

示例 42:带 @requireAll 的框架
{
  "@context": {"@vocab": "http://example.org/"},
  "@type": "Library",
  "contains": {
    "@requireAll": true,
    "creator": {},
    "title": {},
    "contains": {
      "@requireAll": true,
      "description": {},
      "title": {}
    }
  }
}

这将再次生成所需的框架化输出:

2.4 反向框架化

本节为非规范性内容。

框架可以包含 @reverse,或者包含使用 @reverse 定义的术语的值, 用于反转输出对象中的关系。例如, 可以使用以下框架反转图书馆示例:

示例 44:反转的图书馆框架
{
  "@context": {
    "@vocab": "http://example.org/",
    "within": {"@reverse": "contains"}
  },
  "@type": "Chapter",
  "within": {
    "@type": "Book",
    "within": {
      "@type": "Library"
    }
  }
}

使用上面的扁平化图书馆示例,会得到以下结果:

常规属性和反向属性之间存在不对称性。 通常,在框架化节点对象时,除非设置了显式 包含标志, 否则节点的所有属性都会包含在输出中,但反向 属性不会,因为它们实际上不是该节点的属性。

要在输出中包含反向属性,请将它们显式添加到框架中。 请注意,如果反向关系不存在,它将直接从输出中 省略。

2.5 框架化命名图

本节为非规范性内容。

框架可以包含 @graph,这允许将 命名图中的信息 暴露在其适当的 图上下文内,这些命名图包含于 JSON-LD 文档中。 默认情况下,框架化使用一个合并图,该图由输入中所有图内的 所有节点对象 组成。通过在框架中使用 @graph, 输出文档可以包含专门来自输入文档中所含 命名 图的信息。

以下示例使用图书馆主题的一个变体,其中信息 分散在默认图和名为 http://example.org/graphs/books 的图之间:

示例 46:带命名图的框架
{
  "@context": {"@vocab": "http://example.org/"},
  "@type": "Library",
  "contains": {
    "@id": "http://example.org/graphs/books",
    "@graph": {
      "@type": "Book"
    }
  }
}
示例 47:带命名图的扁平化输入
[{
  "@context": {"@vocab": "http://example.org/"},
  "@id": "http://example.org/graphs/books",
  "@graph": [{
    "@id": "http://example.org/library/the-republic",
    "@type": "http://example.org/Book",
    "http://example.org/contains": {
      "@id": "http://example.org/library/the-republic#introduction"
    },
    "http://example.org/creator": "Plato",
    "http://example.org/title": "The Republic"
  }, {
    "@id": "http://example.org/library/the-republic#introduction",
    "@type": "http://example.org/Chapter",
    "http://example.org/description": "An introductory chapter on The Republic.",
    "http://example.org/title": "The Introduction"
  }]
}, {
  "@context": {"@vocab": "http://example.org/"},
  "@id": "http://example.org/library",
  "@type": "http://example.org/Library",
  "http://example.org/contains": {"@id": "http://example.org/graphs/books"},
  "http://example.org/name": "Library"
}]

3. 一致性

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

本文档中的关键词 MAYMUSTMUST NOTSHOULDSHOULD NOT 应按 BCP 14 [RFC2119] [RFC8174] 中所述解释,当且仅当它们像这里所示一样全部大写时。

有一类产品可以声称符合本 规范:JSON-LD 处理器

符合规范的 JSON-LD 处理器是一个系统, 它能够以与本规范中定义的算法一致的方式执行 框架化操作。

JSON-LD 处理器不得 尝试纠正格式错误的 IRI 或语言标签; 但是,它们可以发出验证警告。除在 相对和绝对 IRI 之间转换外, 不会修改 IRI。

除非使用 processingMode API 选项指定, 否则处理模式 使用本地上下文中的 @version 条目设置,并影响包括展开压缩在内的算法行为。 一旦设置,尝试更改为不同处理模式就是错误, 处理器必须生成 处理 模式冲突 错误并中止进一步处理。

本规范中的算法通常更关注清晰性 而非效率。因此,JSON-LD 处理器可以 以任何期望的方式实现本规范给出的算法, 只要最终结果与通过规范算法获得的结果 无法区分即可。

在描述对关键字执行操作的算法步骤中,这些步骤 也适用于关键字 别名。

实现者可以通过成功通过 JSON-LD 框架化测试套件 的测试用例,部分检查其对本规范的一致性级别。 但请注意,通过测试 套件中的所有测试并不意味着完全符合本规范。它仅意味着 该实现符合测试套件所测试的方面。

4. 框架化

以下章节描述用于框架化 JSON-LD 文档的算法。 框架化是这样一个过程:取得一个表达信息图的 JSON-LD 文档,并应用特定的图布局 (称为框架)。

框架化使用节点映射 生成算法, 将 JSON-LD 文档中定义的每个对象放入扁平化主体映射中,从而允许 框架化算法对其进行操作。

本节中描述的所有算法都旨在操作 语言原生数据结构。也就是说,这些算法均不要求将基于文本的 JSON 文档序列化作为输入或输出。

对 JSON 数据结构的引用会使用其内部表示来解释,以便 描述算法。

4.1 框架化算法

4.1.1 概述

有效的 JSON-LD 框架是有效 JSON-LD 文档的超集, 允许附加内容,并且这些内容会在展开过程中保留。 JSON-LD 1.1 语法规范 [JSON-LD11] 中定义的语法 扩展如下:

4.1.2 算法

框架化算法接受 五个必需输入变量和一个可选输入变量。 必需输入包括 框架化状态state)、 要框架化的 subjects 列表、 输入框架expanded frame)、 用于收集部分框架结果的 parent, 以及 active property。 可选输入变量是 ordered 标志。

该算法向 parent 添加元素:如果它是数组,则将元素追加到 parent;如果它是映射, 则将元素追加到 parent 中与 active property 关联的数组。 请注意,如果 parent数组,则 active property必须null, 而如果它是映射, 则它不得null

  1. 如果 frame数组,则将 frame 设置为该 数组的值,该值必须是有效框架。 如果确定 frame 无效, 则检测到invalid frame 错误并中止处理。
    1. Frame必须映射
    2. 如果 frame 具有 @id 条目,其值必须为以下之一: 包含单个空映射作为值的 数组、 有效IRI, 或者所有值均为有效IRI数组
    3. 如果 frame 具有 @type 条目,其值必须为以下之一: 包含单个空映射作为值的 数组、 包含一个映射数组,该映射具有键为 @default条目、 有效IRI, 或者所有值均为有效IRI数组
  2. state 中的 对象嵌入标志显式 包含标志要求全部标志 初始化标志 embedexplicitrequireAll, 并用 frame@embed@explicit@requireAll 的任何属性值覆盖。
  3. 通过使用框架匹配算法statesubjectsframerequireAllsubjectsframe 进行过滤, 创建匹配主体列表。
  4. 对于匹配主体集合中的每个 id 和关联的节点对象 node如果可选 ordered 标志为 true,则按 id 的字典序排序:
    1. output 初始化为一个新的映射,带有 @idid
    2. 如果 state 中的嵌入标志false, 并且在 state 中存在与 graph nameid 关联的已嵌入节点, 则不再对此 node 执行额外处理。
    3. 否则,如果 state 中的嵌入标志true, 且 embed@never,或者嵌入会创建循环引用, 则将 output 添加到 parent, 并不再对此 node 执行额外处理。
    4. 否则,如果 state 中的嵌入标志trueembed@once, 并且在 state 中存在与 graph nameid 关联的已嵌入节点, 则将 output 添加到 parent, 并不再对此 node 执行额外处理。
    5. 如果 state 中的 graph map 具有 id 的条目:
      1. 如果 frame 没有 @graph 条目, 则将 recurse 设置为 true,除非 state 中的 graph name@merged, 并将 subframe 设置为新的空映射
      2. 否则,将 subframe 设置为 frame@graph 的第一个条目, 或者在其不存在时设置为新的空映射,并 将 recurse 设置为 true,除非 id@merged@default
      3. 如果 recursetrue
        1. stategraph name 的值设置为 id
        2. state嵌入标志的值设置为 false
        3. 调用该算法, 使用 state 的副本, 其中 graph name 的值设置为 id嵌入标志的值设置为 false; 将 state 中与 id 关联的 graph map 的键作为 subjectssubframe 作为 frameoutput 作为 parent,并将 @graph 作为 active property
    6. 如果 frame 具有 @included 条目, 则调用该算法, 使用 state 的副本,其中嵌入标志的值设置为 falsesubjectsframeoutput 作为 parent,并将 @included 作为 active property
    7. 对于 node 中的每个 propertyobjects如果可选 ordered 标志为 true,则按 property 的字典序排序:
      1. 如果 property关键字,则将 propertyobjects 添加到 output
      2. 否则,如果 property 不在 frame 中,并且 explicittrue处理器 不得output 添加 property 的任何值,并跳过以下 步骤。
      3. 对于 objects 中的每个 item
        1. 如果 item 是具有 @list 属性的映射,则按顺序处理列表中的每个 listitem,并添加到输出中的新列表映射
          1. 如果 listitem节点 引用, 则调用该算法, 使用 state 的副本,其中 嵌入标志的值设置为 true, 将 listitem@id 的值 作为新 subjects 数组中的唯一项, 将 frame@list 的第一个值作为 framelist 作为 parent,并将 @list 作为 active property。 如果 frame 不存在,则使用新的映射 创建新的 frame,其中 @embed@explicit@requireAll 的属性 取自 embedexplicitrequireAll
          2. 否则,将 listitem 的副本追加到 list 中的 @list
        2. 如果 item节点 引用, 则调用该算法, 使用 state 的副本,其中 嵌入标志的值设置为 true, 将 item@id 的值 作为新 subjects 数组中的唯一项, 将 frameproperty 的第一个值作为 frameoutput 作为 parent,并将 property 作为 active property。 如果 frame 不存在,则使用 新的映射 创建新的 frame, 其中 @embed@explicit@requireAll 的属性 取自 embedexplicitrequireAll
        3. 否则,将 item 的副本追加到 output 中的活动 属性
      4. 对于 frame 中每个非关键字propertyobjects (除 `@type 外) 且该 property 不在 output 中:
        1. itemobjects 中的第一个值,该值必须框架对象
        2. property frame 设置为 objects 中的第一个值, 或者如果值为 objects,则设置为新创建的框架对象property frame必须映射
        3. 如果 property frame 包含 值为 true@omitDefault, 或者不包含 @omitDefaultstate省略默认值标志的值为 true, 则跳过 propertyproperty frame
        4. output 添加 property,其值为 一个新的映射, 该映射具有 @preserve 属性,其值是 frame@default 的值的副本(如果存在), 否则为字符串 @null
      5. 如果 frame 具有属性 @reverse,则 对于 frame@reverse 值中的每个 reverse propertysub frame
        1. output 中创建一个 @reverse 属性,其值为新的 映射 reverse dict
        2. 对于扁平化主体映射中的每个 reverse idnode,若其具有 属性 reverse property,且该属性包含一个 @idid节点 引用
          1. reverse dict 添加 reverse property, 其值为一个新的空数组
          2. 调用该算法, 使用 state 的副本,其中 嵌入标志的值设置为 true, 将 reverse id 作为新 subjects 数组中的唯一项, sub frame 作为 framenull 作为 active property, 并将 reverse dictreverse property数组值作为 parent
      6. 一旦在前面步骤中按要求设置了 output, 则将 output 添加到 parent

4.2 框架匹配算法

框架匹配算法作为框架化算法的一部分使用, 用于确定特定节点对象是否匹配 框架中设置的条件。 一般来说,如果节点对象满足 @type@id 上的匹配, 或者匹配若干不同属性之一,则该节点对象匹配框架。 如果要求全部标志true,则所有属性都必须具有默认值 或匹配,框架才匹配。

由于匹配是在展开后的节点对象上执行的,因此所有值都将采用 数组形式。

节点匹配使用 JSON 构造的组合来匹配任意零个某些特定值:

[]不匹配任何值
空数组不匹配任何值,或者匹配本身为空数组的值。
[框架对象]节点模式
非空框架对象, 用于通过递归节点匹配来匹配特定值。
[IRI+]
一个或多个采用 IRI 形式的字符串,用于按 @type@id 匹配, 允许匹配所列 IRI 中的任意一个。
[值对象]值模式
值对象, 用于匹配特定值。在值对象中, @value@type@language 的值 也可以是一个或多个字符串值组成的数组, @language 的值在比较时不区分大小写。
{}通配符
包含空对象的数组 (在排除属于框架化关键字的任何属性之后) 匹配任何存在的值,并且在没有值时不匹配。

框架匹配算法接受框架化状态state)、 来自扁平化主体映射的待匹配主体列表(subjects)、 要匹配的框架frame)以及 requireAll 标志, 并通过按如下方式过滤 subjects 中的每个 node 返回匹配主体列表:

匹配框架时会考虑所有属性,包括 @id@type, 但不考虑其他关键字

  1. 如果 frame 没有属性,则 node 匹配。
  2. 如果 requireAlltrue,则当 frame 中的所有属性 (property) 都匹配以下任一条件时,node 匹配。 或者,如果 requireAllfalse,则当 frame 中的任意属性 (property) 匹配以下任一条件时匹配。 对于 node 中来自 frame 的每个 propertyvalues
    1. 如果 property@id
      1. 如果 frame 中的 @id 属性包含 values 中的任何 IRI, 则 property 匹配。
      2. 否则,如果 frame 中的 @type 属性是 通配符不匹配任何值, 则 property 匹配。
      框架化作用于扁平化主体映射, 而扁平化行为确保所有主体都有 @id 属性;因此 "@id": [] 模式 永远不会匹配任何节点对象"@id": [{}] 模式将 匹配任何节点对象, 并等价于完全不在 frame 中指定 @id 属性
    2. 否则,如果 property@type
      1. 如果 frame 中的 @type 属性包含 values 中的任何 IRI, 则 property 匹配。
      2. 否则,如果 values 不为空且 frame 中的 @type 属性是 通配符, 则 property 匹配。
      3. 否则,如果 values 为空且 frame 中的 @type 属性是 不匹配任何值, 则 property 匹配。
      4. 否则,如果 frame 中的 @type 属性 是默认对象, 则 property 匹配。
      5. 否则,property 不匹配。
    3. 如果 property@id@type 且不匹配, 则 node 不匹配,并终止处理。
    4. 否则,frameproperty 的值必须为空,或是包含有效框架的数组。
    5. 如果 values 为空或不存在, frameproperty 的值 是仅包含任意值的 @default 条目映射, 并且 node 中任何其他属性具有非默认匹配,则 property 匹配。
    6. 如果 values 不为空且 frameproperty 的值是 不匹配任何值, 则 node 不匹配,并中止进一步匹配。
    7. 否则,如果 values 不为空且 frameproperty 的值是 通配符, 则 property 匹配。
    8. 否则,如果 frameproperty 的值是值模式value pattern): 属性匹配使用值匹配算法确定。
    9. 否则,对于作为 frameproperty 值之一的任何 节点模式node pattern):
      1. value subjects 为来自扁平化主体映射的主体列表,该列表匹配 values 中的节点对象值。
      2. matched subjects 为递归调用此算法的结果, 传入 state、作为 subjectsvalue subjects、 作为 framenode pattern,以及 requireAll 标志。
      3. 如果 matched subjects 不为空,则 property 匹配。
    10. 否则,property 不匹配。

4.3 值模式匹配 算法

值模式匹配算法作为框架化框架匹配算法的一部分使用。值对象 使用 不匹配任何值通配符 模式,在 @value@type@language 上匹配值模式,同时还允许特定值与使用 数组形式为每个值 对象属性定义的一组值匹配。

该算法接受值模式pattern)和值对象value)作为 参数。 Value 使用以下算法匹配 pattern:

  1. v1t1l1value@value@type@language 的值,如果不存在则为 null其中 @language 的值会规范化为小写。
  2. v2t2l2value pattern@value@type@language 的值,如果不存在则为 null其中 @language 的字符串值会规范化为 小写。
  3. pattern通配符 时,或满足以下条件时,Value 匹配 pattern
    1. v1v2 中,或者 v1 不是 nullv2通配符, 并且
    2. t1t2 中,或者 t1 不是 nullt2通配符, 或 null,或者 t1nullt2null不匹配任何值, 并且
    3. l1l2 中,或者 l1 不是 nulll2通配符, 或 null,或者 l1nulll2null不匹配任何值

5. 应用程序编程 接口

此 API 提供一种简洁机制,使开发者能够将 JSON-LD 数据转换为各种在不同编程语言中更易处理的输出格式。 如果在某个编程环境中提供 JSON-LD API,则以下 API 的全部内容必须实现。

JSON-LD API 使用 Promises 来表示 各种延迟操作的结果。 Promises 定义于 [ECMASCRIPT]。 规范中的一般用法可参见 [promises-guide]。 实现可以选择以适合其原生环境的方式实现, 只要它们通常使用相同的方法、参数和选项, 并返回相同结果即可。

接口标记为 [Exposed=JsonLd], 这会创建一个全局接口。 JSON-LD 中使用 WebIDL 虽然适合在浏览器中使用, 但并不限于这种用途。

5.1 JsonLdProcessor

JSON-LD 处理器接口 是开发者用于访问 JSON-LD 转换方法的 高层编程结构。下面的定义是对 JSON-LD 1.1 API [JSON-LD11-API] 中定义接口的实验性 扩展。

需要强调的是,实现不会修改输入参数。 如果检测到错误,Promise 会以带有适当 codeJsonLdFramingError 被拒绝, 并停止处理。

WebIDL/*
 * The JsonLd interface is created to expose the JsonLdProcessor interface.
 */
[Global=JsonLd, Exposed=JsonLd]
interface JsonLd {};

[Exposed=JsonLd]
interface JsonLdProcessor {
  constructor();
  static Promise<JsonLdRecord> frame(
    JsonLdInput input,
    JsonLdInput frame,
    optional JsonLdOptions options = {});
};

JsonLdProcessor 接口的 frame() 方法会按照框架化 算法中的步骤, 使用frame 对给定的 input 进行框架化

  1. 创建新的 Promise promise 并返回它。随后异步执行以下步骤。
  2. 如果提供的inputRemoteDocument, 则将 remote document 初始化为input
  3. 否则,如果提供的input 是表示远程文档 IRI字符串, 则等待并使用 LoadDocumentCallback 将其解引用为 remote document, 将input 作为 url 传入, 并将extractAllScripts 选项从options 作为 extractAllScripts 传入。
  4. expanded input 设置为使用 expand 方法的结果:若存在 remote document 则使用它, 否则使用input 作为 input, 并使用options 且将 ordered 设置为 false
  5. 如果提供的frameRemoteDocument, 则将 remote frame 初始化为frame
  6. 否则,如果提供的frame 是表示远程文档 IRI字符串, 则等待并使用 LoadDocumentCallback 将其解引用为 remote frame, 将frame 作为 url 传入, 并将extractAllScripts 选项从options 作为 extractAllScripts 传入。
  7. expanded frame 设置为使用 expand 方法的结果:若存在 remote frame 则使用它, 否则使用frame 作为 input, 使用options, 将frameExpansion 选项设置为 true并将ordered 设置为 false
  8. context 设置为来自 remote frameframe@context 的值(如果存在),否则设置为 新的空上下文
  9. context base 设置为 remote frame 中的 documentUrl (如果可用),否则设置为base 选项, 该选项来自options
  10. active context 初始化为上下文处理 算法的结果, 将新的空上下文作为 active context、 将 context 作为 local context、 并将 context base 作为 base URL 传入。
  11. 使用 context 初始化活动上下文基准 IRI设置为 base 选项, 该选项来自options(如果已设置); 否则,如果 compactToRelative 选项为 true,则设置为当前正在处理的 文档的 IRI(如果可用);否则设置为 null
  12. inverse context 初始化为执行 反向上下文创建 算法的结果。
  13. 如果frame 有一个顶层 属性会展开为 @graph,则将 frameDefault 选项设置到options 中,其值为 true
  14. 将新的框架化 状态state)初始化为空映射
    1. state 中的对象嵌入 标志设置为 embed, 默认值为 @once
    2. state 中的嵌入标志 设置为 false
    3. state 中的显式 包含标志设置为 explicit, 默认值为 false
    4. state 中的要求全部 标志设置为 requireAll, 默认值为 false
    5. state 中的省略默认值 标志设置为 omitDefault, 默认值为 false
    6. state 中的 graph name 设置为: 如果 frameDefaulttrue,则为 @default, 否则为 false
    7. state 中的 graph map 设置为对 expanded input 执行 节点映射生成 算法的结果。
      1. 如果 state 中的 graph name@merged, 则在 graph map 中为 @merged 添加一个条目, 其值设置为 传入 graph map 执行 合并节点映射 算法的结果。
    8. state 中的 subject map 设置为扁平化 主体映射,它是 graph mapgraph name 的值。
  15. results 初始化为空数组
  16. 调用 框架化算法,传入 statestatesubject map 的键作为 subjectsexpanded frameresults 作为 parent, 以及 null 作为 active property
  17. 如果处理模式不是 json-ld-1.0, 则移除 results 中每个节点对象@id 条目,其中该条目值是空白节点标识符, 且在 results 内任何属性值中仅出现一次。
  18. 递归地,将 results 中键为 @preserve 的所有 条目 替换为该条目的第一个值。
    该条目的值将是包含单个值的数组; 这将有效地把包含 @preserve 的映射替换为该值。
  19. compacted results 设置为使用 compact 方法的结果,使用 active contextinverse contextnull 作为 active propertyresults 作为 element、, 以及来自optionscompactArrays ordered 标志。
    1. 如果 compacted results 是空数组, 则将其替换为新的映射
    2. 否则,如果 compacted results数组, 则将其替换为新的映射,该映射具有单个条目, 其键是 IRI 压缩 @graph 的结果,值为 compacted results
    3. compacted results 添加 @context 条目,并将其值设置为 提供的 context
  20. 递归地,将 compacted results 中所有 @null 值替换为 null。 如果替换后某个数组仅包含值 null, 则移除该值,留下 空数组。
  21. 如果 omitGraphfalse compacted results 没有顶层 @graph 条目,或者其值 不是数组,则修改 compacted results,将 compacted results 的非 @context 条目 放入一个包含于 @graph数组值中的映射内。 如果 omitGraphtrue,顶层 @graph 条目仅用于包含多个节点对象
  22. 使用 compacted results 兑现 promise, 将 compacted results内部 表示转换为 JSON 序列化。
input
要对其执行框架化的 JSON-LD 对象或 JSON-LD 对象数组,或者引用要框架化的 JSON-LD 文档的 IRI
frame
用于重新排列 input 数据的框架;其形式可以是映射, 也可以是 IRI
options
一组选项,可能影响框架化算法,例如 输入文档的基准 IRIJsonLdOptions 类型定义默认选项 值。
WebIDLtypedef record<USVString, any> JsonLdRecord;

JsonLdRecord 是用于包含任意映射条目映射定义, 这些条目是解析 JSON 对象的结果。

WebIDLtypedef (JsonLdRecord or sequence<JsonLdRecord> or USVString or RemoteDocument) JsonLdInput;

JsonLdInput 接口用于指代 一个输入值, 该值可以是 JsonLdRecordJsonLdRecordssequence、 表示 IRI字符串, 该 IRI 可以被解引用以获取有效 JSON 文档, 或已解引用的 RemoteDocument

当该值是 JsonLdRecordJsonLdRecords 的 sequence 时, 这些值会被视为其等价的内部表示值, 其中 JsonLdRecord 等价于映射, 而 JsonLdRecords 的 sequence 等价于由映射 组成的数组映射条目会被转换为 [INFRA] 中的等价项。

5.2 错误处理

JsonLdFramingError 类型用于 报告处理错误。

WebIDLdictionary JsonLdFramingError {
  JsonLdFramingErrorCode code;
  USVString? message = null;
};
enum JsonLdFramingErrorCode {
  "invalid frame",
  "invalid @embed value"
};

JSON-LD 框架化扩展了 JSON-LD 1.1 处理算法和 API JSON-LD 1.1 API [JSON-LD11-API] 中定义的错误接口和错误码。

code
表示特定错误类型的字符串,如本文档中的各种算法所述。
message
可选错误消息,包含额外的调试信息。 错误消息的具体内容超出本规范范围。

JsonLdFramingErrorCode 表示有效 JSON-LD 框架化错误码的集合。

invalid @embed value
@embed 的值不是对象嵌入标志可识别的值之一。
invalid frame
框架无效。

5.3 数据结构

本节描述 JSON-LD API 中使用的数据类型定义。

5.3.1 JsonLdContext

JsonLdContext 类型用于 指代一个值, 该值可以是映射、表示 IRI字符串, 或由映射字符串组成的数组。

参见 JSON-LD 1.1 API [JSON-LD11-API] 中的 JsonLdContext 定义。

5.3.2 JsonLdOptions

JsonLdOptions 类型用于向 JsonLdProcessor 方法传递 各种选项。

WebIDLdictionary JsonLdOptions {
  (JsonLdEmbed or boolean)  embed         = "@once";
  boolean                   explicit      = false;
  boolean                   omitDefault   = false;
  boolean                   omitGraph;
  boolean                   requireAll    = false;
  boolean                   frameDefault  = false;
  boolean                   ordered       = false;
};

enum JsonLdEmbed {
  "@always",
  "@once",
  "@never"
};

除了 JSON-LD 1.1 API [JSON-LD11-API] 中定义的选项外, 框架化还定义这些 附加选项:

embed
设置对象 嵌入标志的值,该标志用于 框架化算法。 布尔值 true 将该标志设置为 @once,而值 false 将该标志 设置为 @never
explicit
设置显式包含标志的值,该标志用于 框架化算法
frameDefault
不对合并图进行框架化,而只对默认图进行框架化。
omitDefault
设置省略 默认值标志的值,该标志用于 框架化算法
omitGraph
设置省略图标志的值,该标志用于 框架化算法。如果未显式设置, 当处理模式json-ld-1.0 时设置为 false,否则设置为 true
ordered
如果设置为 true,则所指示的某些算法 处理步骤会按字典序排序。 如果为 false,处理时不考虑 顺序。
requireAll
设置要求 全部标志的值,该标志用于 框架化算法

JsonLdEmbed 枚举 embed 选项的值:

@always
始终将节点对象作为属性值嵌入, 除非这会 导致循环引用。
@never
序列化匹配值时始终使用节点引用
@once
在给定节点对象中只应嵌入单个值, 其他属性的其他值使用节点引用。如果既未指定 @embed,也未指定对象嵌入标志, 则这是默认值。

参见 JSON-LD 1.1 API [JSON-LD11-API] 中的 JsonLdOptions 定义。

6. 安全考量

参见 § A. IANA 考量中的 安全考量

7. 隐私考量

参见 [JSON-LD11] 中的 隐私考量

8. 国际化 考量

参见 [JSON-LD11] 中的 国际化考量

A. IANA 考量

本节仅用于标准社区审查;如果本规范 成为 W3C 推荐标准, 将提交给互联网工程指导组。

JSON-LD 框架使用 [JSON-LD11] 中描述的同一 MIME 媒体类型, 并带有必需的 profile 参数。

application/ld+json

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

标识该资源为 JSON-LD 框架的单个 URI。 当在不了解 profile 的情况下处理时,profile 不会改变资源表示的语义, 因此了解和不了解带 profile 资源的客户端都可以安全地使用同一 表示。

http://www.w3.org/ns/json-ld#framed
用于指定 JSON-LD 框架

在提供和请求 JSON-LD 框架文档时,应该使用 http://www.w3.org/ns/json-ld#framed

编码考量:
参见 RFC 8259,第 11 节
安全考量:
参见 RFC 8259,第 12 节 [RFC8259]

由于 JSON-LD 旨在作为有向图的纯数据交换格式, 因此该序列化不应该通过 JavaScript 的 eval() 函数等代码执行机制来解析。(无效)文档可能包含代码, 执行后可能导致意外副作用,从而危及 系统安全。

处理 JSON-LD 文档时,通常会自动跟随指向远程上下文的链接, 从而在没有用户对每个文件提出明确请求的情况下传输文件。 如果远程上下文由第三方提供, 这可能允许其收集使用模式或类似信息,从而引发隐私问题。 特定实现,例如 JSON-LD 1.1 处理算法和 API 规范 [JSON-LD11-API] 中定义的 API, 可以提供细粒度机制来控制这种行为。

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

鉴于 JSON-LD 允许用短术语替代长 IRI, JSON-LD 文档在处理时可能会大幅展开,在最坏情况下, 生成的数据可能耗尽接收者的所有资源。应用程序 应对任何数据保持适当怀疑。

由于 JSON-LD 对可使用的 IRI 方案不设限制, 且词汇表相对 IRI 使用字符串拼接而不是 IRI 解析,因此可能构造出 在解引用时可被恶意使用的 IRI。

互操作性考量:
不适用
已发布规范:
https://www.w3.org/TR/json-ld11-framing
使用此媒体类型的应用程序:
任何需要交换有向图的编程环境。 JSON-LD 的实现已经为 JavaScript、Python、Ruby、PHP 和 C++ 创建。
附加信息:
魔数:
不适用
文件扩展名:
.jsonld
Macintosh 文件类型代码:
TEXT
联系以获取更多信息的人员与电子邮件地址:
Ivan Herman <ivan@w3.org>
预期用途:
通用
使用限制:
作者:
Manu Sporny、Gregg Kellogg、Markus Lanthaler、Dave Longley
变更控制者:
W3C

application/ld+json 一起使用的片段标识符 会按照 RDF 语法处理,如 RDF 1.1 概念和抽象语法 [RDF11-CONCEPTS] 所述。

B. IDL 索引

本节为非规范性内容。

WebIDL/*
 * The JsonLd interface is created to expose the JsonLdProcessor interface.
 */
[Global=JsonLd, Exposed=JsonLd]
interface JsonLd {};

[Exposed=JsonLd]
interface JsonLdProcessor {
  constructor();
  static Promise<JsonLdRecord> frame(
    JsonLdInput input,
    JsonLdInput frame,
    optional JsonLdOptions options = {});
};

typedef record<USVString, any> JsonLdRecord;

typedef (JsonLdRecord or sequence<JsonLdRecord> or USVString or RemoteDocument) JsonLdInput;

dictionary JsonLdFramingError {
  JsonLdFramingErrorCode code;
  USVString? message = null;
};
enum JsonLdFramingErrorCode {
  "invalid frame",
  "invalid @embed value"
};

dictionary JsonLdOptions {
  (JsonLdEmbed or boolean)  embed         = "@once";
  boolean                   explicit      = false;
  boolean                   omitDefault   = false;
  boolean                   omitGraph;
  boolean                   requireAll    = false;
  boolean                   frameDefault  = false;
  boolean                   ordered       = false;
};

enum JsonLdEmbed {
  "@always",
  "@once",
  "@never"
};

C. 开放问题

本节为非规范性内容。

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

问题 29:允许 类作用域框架化 defer-future-versionspec:enhancement

允许类作用域框架化。

问题 38: 同一框架文档中有多个框架?defer-future-versionspec:enhancementspec:substantive

同一框架文档中有多个框架?

问题 73:重新框架化关系 defer-future-version

重新框架化关系。

D. 自 2012 年 8 月 30 日 1.0 草案以来的变更

本节为非规范性内容。

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

本节为非规范性内容。

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

本节为非规范性内容。

G. 自 2020 年 5 月 7 日提议推荐标准发布版以来的变更

本节为非规范性内容。

H. 致谢

本节为非规范性内容。

编辑们特别感谢以下个人对本规范的编写和编辑作出 重要贡献:

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

还要非常感谢 JSON-LD 社区 组的参与者,他们在邮件列表和 每周电话会议中处理了许多技术问题:Chris Webber、David Wood、Drummond Reed、Eleanor Joslin、Fabien Gandon、Herm Fisher、Jamie Pitts、Kim Hamilton Duffy、Niklas Lindström、Paolo Ciccarese、Paul Frazze、Paul Warren、Reto Gmür、Rob Trainer、Ted Thibodeau Jr. 和 Victor Charpenay。

I. 参考文献

I.1 规范性参考文献

[BCP47]
用于标识语言的标签。A. Phillips;M. Davis。IETF。2009 年 9 月。IETF 最佳当前实践。URL:https://tools.ietf.org/html/bcp47
[ECMASCRIPT]
ECMAScript 语言规范。Ecma International。URL:https://tc39.es/ecma262/
[INFRA]
Infra 标准。Anne van Kesteren;Domenic Denicola。WHATWG。现行标准。URL:https://infra.spec.whatwg.org/
[JSON-LD10]
JSON-LD 1.0。Manu Sporny;Gregg Kellogg;Marcus Langhaler。W3C。2014 年 1 月 16 日。W3C 推荐标准。URL:https://www.w3.org/TR/2014/REC-json-ld-20140116/
[JSON-LD11]
JSON-LD 1.1。Gregg Kellogg; Pierre-Antoine Champin;Dave Longley。W3C。2020 年 5 月 7 日。W3C 提议推荐标准。URL:https://www.w3.org/TR/json-ld11/
[JSON-LD11-API]
JSON-LD 1.1 处理算法和 API。Gregg Kellogg;Dave Longley;Pierre-Antoine Champin。W3C。2020 年 5 月 7 日。W3C 提议推荐标准。URL:https://www.w3.org/TR/json-ld11-api/
[LINKED-DATA]
关联数据设计 问题。Tim Berners-Lee。W3C。2006 年 7 月 27 日。W3C 内部文档。URL:https://www.w3.org/DesignIssues/LinkedData.html
[promises-guide]
编写使用 Promise 的 规范。Domenic Denicola。W3C。2018 年 11 月 9 日。TAG 结论。URL:https://www.w3.org/2001/tag/doc/promises-guide
[RDF-SCHEMA]
RDF Schema 1.1。Dan Brickley; Ramanathan Guha。W3C。2014 年 2 月 25 日。W3C 推荐标准。URL:https://www.w3.org/TR/rdf-schema/
[RDF11-CONCEPTS]
RDF 1.1 概念和抽象 语法。Richard Cyganiak;David Wood;Markus Lanthaler。W3C。2014 年 2 月 25 日。 W3C 推荐标准。URL:https://www.w3.org/TR/rdf11-concepts/
[RFC2119]
用于在 RFC 中表示 要求级别的关键词。S. Bradner。IETF。1997 年 3 月。最佳当前实践。URL:https://tools.ietf.org/html/rfc2119
[RFC3987]
国际化资源标识符 (IRI)。M. Duerst;M. Suignard。IETF。2005 年 1 月。提议标准。URL:https://tools.ietf.org/html/rfc3987
[RFC8174]
RFC 2119 关键词中大写与小写的歧义。B. Leiba。IETF。2017 年 5 月。最佳当前实践。URL:https://tools.ietf.org/html/rfc8174
[RFC8259]
JavaScript 对象表示法(JSON)数据 交换格式。T. Bray,编辑。IETF。2017 年 12 月。互联网标准。URL:https://tools.ietf.org/html/rfc8259
[WEBIDL]
Web IDL。Boris Zbarsky。W3C。2016 年 12 月 15 日。W3C 编辑草案。URL:https://heycam.github.io/webidl/

I.2 资料性参考文献

[JSON-LD10-FRAMING]
JSON-LD 框架化 1.0。Manu Sporny;Gregg Kellogg;David Longley;Marcus Langhaler。W3C。2012 年 8 月 30 日。非官方草案。URL:https://json-ld.org/spec/ED/json-ld-framing/20120830/