摘要

本规范详细描述了一个使用 JSON 格式来表示潜在和已完成活动的模型。其预期与用于描述活动结构及定义特定类型活动的词汇表配合使用。

作者说明

本节为非规范性内容。

本草案受到最初由 Martin Atkins、Will Norris、Chris Messina、Monica Wilkinson、Rob Dolin 和 James Snell 共同撰写的 JSON Activity Streams 1.0 规范的重大影响。作者非常感谢他们的重要贡献,并十分荣幸能在他们的基础上进行工作。本文件中引用了 Activity Streams 1.0 原始文本的部分内容。

本文档状态

本节描述了本文件发布时的状态。其他文档可能会取代本文件。当前 W3C 出版物列表及本技术报告的最新修订版本,请参见 W3C 技术报告索引(https://www.w3.org/TR/)。

本文档由 社交网络工作组(Social Web Working Group) 以推荐标准的形式发布。欢迎对本文件提出意见。请发送至 public-socialweb@w3.org订阅存档)。

请参阅工作组的实现报告

本文档已由 W3C 会员、软件开发者及其他 W3C 相关团体和利益相关方审核,并由主管作为 W3C 推荐标准加以认可。本文件为稳定文档,可作为参考资料或被其他文档引用。W3C 发布推荐标准的作用在于引起社区关注并促进其广泛部署,从而提升 Web 的功能性与互操作性。

本文件由遵循 2004年2月5日 W3C 专利政策 的工作组制定。 W3C网站上维护了与该工作组交付物相关的专利披露公开列表,页面上也包括专利披露的说明。任何已知某项专利并认为其包含 基本权利要求(Essential Claim)的个人,须按照 《W3C 专利政策》第6节进行披露。

本文件受 2017年3月1日 W3C 流程文件管理。

1. 简介

从最基本的意义上说,“Activity”(活动)是对某个动作的语义描述。本规范的目标是提供一种基于 JSON 的语法,能够以丰富、人性化但同时对机器友好和可扩展的方式表达关于活动的元数据。这包括用来构造关于活动的自然语言描述或可视化表示,将可操作信息关联到各种对象类型,传递或记录活动日志,或将潜在动作委托给其他应用等场景。

本文档中的“必须”、“禁止”、“要求”、“应当”、“不应当”、“ 建议”、“不建议”、“推荐”、“可以”以及 “可选”等关键词应据 [RFC2119] 的定义理解。

1.1 与其他社交标准的关系

本节为非规范性内容。

Activity Streams 2.0 适合作为社会化数据语法。它是 [SWP] 相关标准体系的一部分。

1.2 与 JSON Activity Streams 1.0 的关系

本节为非规范性内容。

JSON Activity Streams 1.0 [AS1] 规范于2011年5月发布,提供了表达已完成活动的可扩展基础语法。本规范在该基础上,结合了大量实现经验、社区反馈以及众多相关领域的持续工作成果进行扩展与完善。

推动 Activity Streams 2.0 从 1.0 演化的一些具体问题包括:

displayNameverbtitle 以及 objectType 这些术语应视为保留词,不应在 Activity Streams 2.0 文档中使用。如遇到它们,则 按照B. 废弃的 Activity Streams 1.0 语法中的处理建议解析。

2. 序列化方式

本规范描述了一种基于 JSON 的 [RFC7159] 序列化语法,用于 Activity Vocabulary,其同时符合 [JSON-LD] 语法约束的子集,但并不要求 JSON-LD 处理能力。虽然也可以用其他序列化形式,但本文档不作讨论。

在序列化时,属性值缺失可以通过(a)将属性值设为 null,或(b)直接省略属性声明,具体由发布方选择。这两种方式在语义上等价。如果某属性的值是数组,则当该数组为空时必须直接省略该属性或将其设为 null。对于被省略或显式为 null 的值,其正确的解释应为“未分配值”,而非“该值为空或为nil”。

Activity Streams Document(活动流文档)是 JSON 文档,其根元素为任意类型的 Activity Streams 对象,包括 集合,且其 MIME 媒体类型为 "application/activity+json"。

Activity Streams 2.0 文档必须采用 UTF-8 字符编码进行序列化。

2.1 JSON-LD

序列化后的 JSON 形式的 Activity Streams 2.0 文档,必须与标准 JSON-LD 1.0 处理算法和 API [JSON-LD-API] 压缩算法生成的结果一致,并且至少要使用本规范性 JSON-LD @context 定义。实现可以通过附加其它 @context 定义进行扩展,但不得覆盖或更改规范性 context。实现可以使用未在 JSON-LD @context 定义中的其他属性和值,但需明白,采用标准 JSON-LD 算法的实现可能不会支持或忽略这些扩展属性。详见可扩展性部分。

JSON-LD 使用特殊的 @context 属性定义处理上下文@context 属性的取值由 [JSON-LD] 规范规定。 生成 Activity Streams 2.0 文档的实现包含一个以 "https://www.w3.org/ns/activitystreams" 作为值的 @context 属性,引用规范性 Activity Streams 2.0 JSON-LD @context 定义。实现可以使用备用 URL "http://www.w3.org/ns/activitystreams"。取值既可为字符串,也可为对象或数组。

2.1.1 字符串形式的 context

1 文档以字符串形式提供 context。
示例 1
{
  "@context": "https://www.w3.org/ns/activitystreams",
  "summary": "A note",
  "type": "Note",
  "content": "My dog has fleas."
}

2.1.2 对象形式的 context

2 文档以对象形式、结合 @vocab 关键字与扩展词汇前缀提供 context。
示例 2
{
  "@context": {
     "@vocab": "https://www.w3.org/ns/activitystreams",
     "ext": "https://canine-extension.example/terms/",
     "@language": "en"
  },
  "summary": "A note",
  "type": "Note",
  "content": "My dog has fleas.",
  "ext:nose": 0,
  "ext:smell": "terrible"
}

2.1.3 数组形式的 context

3 文档以数组形式提供 context,并为额外的词汇定义别名。
示例 3
{
  "@context": [
     "https://www.w3.org/ns/activitystreams",
     {
      "css": "http://www.w3.org/ns/oa#styledBy"
     }
  ],
  "summary": "A note",
  "type": "Note",
  "content": "My dog has fleas.",
  "css": "http://www.csszengarden.com/217/217.css?v=8may2013"
}

当支持 JSON-LD 的 Activity Streams 2.0 实现遇到 MIME 类型为 "application/activity+json" 的 JSON 文档且其中不包含引用规范性 Activity Streams 2.0 JSON-LD @context 定义@context 属性时,实现仍必须假定该规范性 @context 依然生效。

2.2 IRIs 与 URLs

本规范采用 IRIs [RFC3987]。每个 URI [RFC3986] 也是一个 IRI,可在要求 IRI 的场景下直接用 URI。有两个注意点:(1) 当出现 IRI 但不是 URI 且需被解析时,必须按 [RFC3987] 3.1 节所述映射为 URI;(2) 当 IRI 用作"id"值时,不得进行此映射。

建议不在 Activity Streams 2.0 文档中使用相对 IRI(或 URL)引用,因为许多 JSON 解析器无法可靠保留用于解析相对引用的基础上下文。

2.3 日期和时间

所有带日期和时间属性的值必须符合 [RFC3339] 的 “date-time” 语法,只是秒可以省略。大写 "T" 用于分隔日期与时间,大写 "Z" 用于无数字时区偏移的情况,必须使用。

规范如下 [ABNF] 语法描述。 构造 "time-hour", "time-minute", "time-second", "time-secfrac", "time-offset" 和 "full-date" 参见 [ RFC3339]。

as2-partial-time = time-hour ":" time-minute [":" time-second]
                   [time-secfrac]
as2-full-time    = as2-partial-time time-offset
as2-date-time    = full-date "T" as2-full-time

需要注意的是,`time-offset` 组件不等同于时区。虽然带 time-offset 的时间适用于时间戳,但没有额外信息和处理,无法可靠地与本地“墙上时间”互相转换。

3. 示例

本节为非规范性内容。

下列是三个不同细节层次的活动示例。

每个示例都以本规范定义的规范 JSON 序列化结果展示。

3.1 最简活动

4 表达 'http://www.test.example/martin' 创建了 'http://example.org/foo.jpg'。未提供其它细节。
示例 4
{
  "@context": "https://www.w3.org/ns/activitystreams",
  "summary": "Martin created an image",
  "type": "Create",
  "actor": "http://www.test.example/martin",
  "object": "http://example.org/foo.jpg"
}

3.2 带部分细节的基本活动

5 表达 “Martin Smith 于 2015 年 2 月 10 日 15:04 UTC 向博客 'Martin's Blog' 添加了一篇文章。” 文章、参与者和目标博客的部分细节通过 Activity Streams 2.0 Vocabulary 中定义的属性给出。
示例 5
{
  "@context": "https://www.w3.org/ns/activitystreams",
  "summary": "Martin added an article to his blog",
  "type": "Add",
  "published": "2015-02-10T15:04:55Z",
  "actor": {
   "type": "Person",
   "id": "http://www.test.example/martin",
   "name": "Martin Smith",
   "url": "http://example.org/martin",
   "image": {
     "type": "Link",
     "href": "http://example.org/martin/image.jpg",
     "mediaType": "image/jpeg"
   }
  },
  "object" : {
   "id": "http://www.test.example/blog/abc123/xyz",
   "type": "Article",
   "url": "http://example.org/blog/2011/02/entry",
   "name": "Why I love Activity Streams"
  },
  "target" : {
   "id": "http://example.org/blog/",
   "type": "OrderedCollection",
   "name": "Martin's Blog"
  }
}

3.3 扩展活动示例

6 下为更为详尽的单条“活动流”示例。
示例 6
{
  "@context": "https://www.w3.org/ns/activitystreams",
  "summary": "Martin's recent activities",
  "type": "Collection",
  "totalItems": 1,
  "items" : [
    {
      "type": "Add",
      "published": "2011-02-10T15:04:55Z",
      "generator": "http://example.org/activities-app",
      "nameMap": {
        "en": "Martin added a new image to his album.",
        "ga": "Martin phost le fisean nua a albam."
      },
      "actor": {
        "type": "Person",
        "id": "http://www.test.example/martin",
        "name": "Martin Smith",
        "url": "http://example.org/martin",
        "image": {
          "type": "Link",
          "href": "http://example.org/martin/image",
          "mediaType": "image/jpeg",
          "width": 250,
          "height": 250
        }
      },
      "object" : {
        "name": "My fluffy cat",
        "type": "Image",
        "id": "http://example.org/album/máiréad.jpg",
        "preview": {
          "type": "Link",
          "href": "http://example.org/album/máiréad.jpg",
          "mediaType": "image/jpeg"
        },
        "url": [
          {
            "type": "Link",
            "href": "http://example.org/album/máiréad.jpg",
            "mediaType": "image/jpeg"
          },
          {
            "type": "Link",
            "href": "http://example.org/album/máiréad.png",
            "mediaType": "image/png"
          }
        ]
      },
      "target": {
        "type": "Collection",
        "id": "http://example.org/album/",
        "nameMap": {
          "en": "Martin's Photo Album",
          "ga": "Grianghraif Mairtin"
        },
        "image": {
          "type": "Link",
          "href": "http://example.org/album/thumbnail.jpg",
          "mediaType": "image/jpeg"
        }
      }
    }
  ]
}

4. 模型

Activity Vocabulary 规范性地定义了 Activity Streams 2.0 的核心对象类型与属性。

该词汇表定义的对象类型被划分为八个核心类型,以及一组扩展活动和对象类型,这些类型在许多社交Web应用中很常见。核心类型包括:

Activity Streams 2.0 文档中的每个 JSON 对象要么是 Object,要么是 Link。词汇表中定义的其它全部类型及所有扩展类型,都派生自这两种基类。

在 Activity Streams 2.0 文档中,一个 JSON 对象若满足:(a) 对象包含一个 type 属性且其值含有 "Link",或 (b) type 属性中的任意类型被定义为 Link 的扩展类型(比如 Mention);则该 JSON 对象被视为 Link。否则,该 JSON 对象被视为 Object 的实例或扩展。

4.1 Object

Object 是 Activity Streams 词汇表的主基类。

除了拥有全局标识(用 id 属性的绝对 IRI 表示)和“对象类型”(用 type 属性表示)外,所有 Object 类型的实例都共享一组由 Activity Vocabulary 规范性定义的通用属性。这些属性包括: attachment | attributedTo | audience | content | context | contentMap | name | nameMap | endTime | generator | icon | image | inReplyTo | location | preview | published | replies | startTime | summary | summaryMap | tag | updated | url | to | bto | cc | bcc | mediaType | duration

所有属性都是可选的(包括 idtype)。

7 下面是一个示例对象,其中使用 idtype 属性来表达全局标识符和对象类型:
示例 7
{
  "@context": "https://www.w3.org/ns/activitystreams",
  "id": "http://example.org/foo",
  "type": "Note",
  "name": "My favourite stew recipe",
  "attributedTo": {
    "id": "http://joe.website.example/",
    "type": "Person",
    "name": "Joe Smith"
  },
  "published": "2014-08-21T12:34:56Z"
}

Activity Vocabulary 定义了一系列适用于许多社交Web应用的 Object 类型。本规范不为这些对象中的大多数定义具备语义特性的专用属性。如需补充更多细节可借助外部词汇表表达。

此外,虽然实现可以自由引入超出 Activity Vocabulary 定义的新 Object 类型,但如果应用过度依赖其他实现无法识别的扩展类型,则可能产生互操作性问题。应注意不要与已有对象类型重复或重叠。

当实现使用的扩展类型与核心词汇类型重叠时,实现 必须 同时注明核心词汇类型。例如,有些词汇表(如 Good Relations Vocabulary)为地点定义了自己的类型。实现者如果希望使用 http://purl.org/goodrelations/v1#Location 作为对象类型,则 必须 同时标明该对象为 Place,如下面所示:

8 一个同时是 Placegr:Location 的对象:
示例 8
{
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    {
      "gr": "http://purl.org/goodrelations/v1#"
    }
  ],
  "type": ["Place", "gr:Location"],
  "name": "Sally's Restaurant",
  "longitude": 12.34,
  "latitude": 56.78,
  "gr:category": "restaurants/french_restaurants"
}

一些外部词汇表定义的属性可能与 Activity Vocabulary 中的属性重叠或重复。若存在重叠,为保证互操作的一致性,实现 必须 优先使用 Activity Vocabulary 中定义的属性。

4.1.1 对象类型的文本表示

Activity Streams 消费者经常需要 Activity Streams 对象的文本表示,例如用于在网页或控制台界面显示。

name 属性 建议 来自创建者或其他用户的输入。

summary 属性 建议 作为备用文本表示(可能由发布者自动生成)。如果没有 name 属性,summary 属性 不应 包含标记,并且 应当 足够简短,以用于合理的对象文本展示。

9 作者自定义名称的 note
示例 9
{
  "@context": "https://www.w3.org/ns/activitystreams",
  "type": "Note",
  "id": "http://example.org/note/123",
  "name": "Our Weather Is Fine",
  "content": "I feel that the weather is appropriate to our season and location."
}
10 自动生成摘要的 note
示例 10
{
  "@context": "https://www.w3.org/ns/activitystreams",
  "type": "Note",
  "id": "http://example.org/note/124",
  "summary": "A note by Sally",
  "content": "Everything is OK here."
}

namesummary 可以 缺失,可以 没有终端用户当前语言的明确值,也 可以 长于当前语言环境下合理展示长度。消费端实现 应当 针对此类情形拥有文本表示回退策略。

4.3 参与者(Actor)

参与者对象是基础 Object 类型的特化,代表能够执行活动的实体。活动词汇表规范性地定义了五类具体的参与者类型: Application(应用) | Group(群组) | Organization(组织) | Person(个人) | Service(服务)

本规范对参与者仅作最通用定义,并未对每一类参与者规定语义上的专用属性。所有 Actor 对象均为 Object 的特化,并继承所有 Object 的核心属性。如有未被活动词汇表覆盖的更多细节,可利用外部词汇表表达。对于 PersonGroupOrganization 实例,建议使用 VCard [ vcard-rdf] 补充元数据。

15 示例:带有扩展 VCard 属性的 Person 类型的 Activity:
示例 15
{
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    {"vcard": "http://www.w3.org/2006/vcard/ns#"}
  ],
  "summary": "Sally created a note",
  "type": "Create",
  "actor": {
    "type": ["Person", "vcard:Individual"],
    "id": "http://sally.example.org",
    "name": "Sally Smith",
    "vcard:given-name": "Sally",
    "vcard:family-name": "Smith"
  },
  "object": {
    "type": "Note",
    "content": "This is a simple note"
  }
}

虽然实现可以自由引入活动词汇表未定义的新类型参与者,但过多依赖其它实现无法识别的扩展类型会带来兼容性问题,应避免与已有参与者类型无谓地重叠或重复。

当实现采用的扩展类型与核心词汇类型发生重叠时,实现 必须 同时声明核心词汇类型。例如,一些词汇表(如 VCard)自定义描述人的类型。实现如需使用 vcard:Individual 作为参与者类型时,必须 同时声明为 Person,如上例所示。

4.4 活动(Activity)

活动对象是基础 Object 类型的特化,用于表达已经发生、正在发生或可能发生的动作。

除了继承所有 Object 实例支持的通用属性外,Activity 对象还支持如下由词汇表定义的附加属性: actor | object | target | origin | result | instrument

type 属性用于标识该活动语句所表达的动作类型。

16 以下为一个简单 Activity 实例:
示例 16
{
  "@context": "https://www.w3.org/ns/activitystreams",
  "summary": "Joe liked a note",
  "type": "Like",
  "id": "http://www.test.example/activity/1",
  "actor": "http://example.org/profiles/joe",
  "object": "http://example.com/notes/1",
  "published": "2014-09-30T12:34:56Z"
}

活动词汇表定义了一小部分常见于社交 Web 应用的 Activity 类型。本规范不为其中多数活动定义语义专用属性。可以用外部词汇表补充活动词汇表未覆盖的更多细节。

实现可自由引入核心词汇以外的新类型 Activity,但如应用过于依赖其它实现无法识别的扩展类型,可能造成互操作性问题。应避免与已有 Activity 类型重复或重叠。

当实现中使用的扩展类型与核心词汇类型重叠时,必须同时指定核心类型。例如,部分词汇表(如 Schema.org)自定义动作类型。如实现希望使用 http://schema.org/LikeAction 作为 Activity 类型,必须 也声明为 Like,如下例所示:

17 一个同时为 Likehttp://schema.org/LikeAction 的 Activity:
示例 17
{
  "@context": "https://www.w3.org/ns/activitystreams",
  "summary": "Joe liked a note",
  "type": ["Like", "http://schema.org/LikeAction"],
  "id": "http://www.test.example/activity/1",
  "actor": "http://example.org/profiles/joe",
  "object": "http://example.com/notes/1",
  "published": "2014-09-30T12:34:56Z"
}

Activity 对象既可用于被动场景(用于记录已发生或正在发生的活动),也可用于指令场景(用作指令,通知应用根据描述的动作修改状态)。由于本规范未定义活动对象处理的规范性模型,具体应被解读为被动通知还是命令行为,留给实现决定。

4.5 非及物活动(IntransitiveActivity)

非及物活动对象是 Activity 类型的特化,用于表达非及物动作。IntransitiveActivity 对象不包含 object 属性。

4.6 集合(Collection)

Collection 对象是基础Object的特化,用作其他 ObjectLink 的容器。

除了继承所有 Object 的基础属性外,所有Collection 类型还包含以下扩展属性: items | totalItems | first | last | current

Collection 内的项目可以是有序的,也可以是无序的。OrderedCollection 类型 可以 用于声明集合始终有序。在 JSON 序列化中,集合的无序项用 items 属性表示,有序项用 orderedItems 属性表示。

18 一个简单的无序集合示例:
示例 18
{
  "@context": "https://www.w3.org/ns/activitystreams",
  "summary": "Object history",
  "type": "Collection",
  "totalItems": 2,
  "items": [
    {
      "type": "Create",
      "actor": "http://www.test.example/sally",
      "object": "http://example.org/foo"
    },
    {
      "type": "Like",
      "actor": "http://www.test.example/joe",
      "object": "http://example.org/foo"
    }
  ]
}
19 一个简单的有序集合示例:
示例 19
{
  "@context": "https://www.w3.org/ns/activitystreams",
  "summary": "Object history",
  "type": "OrderedCollection",
  "totalItems": 2,
  "orderedItems": [
    {
      "type": "Create",
      "actor": "http://www.test.example/sally",
      "object": "http://example.org/foo"
    },
    {
      "type": "Like",
      "actor": "http://www.test.example/joe",
      "object": "http://example.org/foo"
    }
  ]
}

4.6.1 集合分页(Collection Paging)

一个 Collection 可能包含大量子项,通常实现者很难将其所有内容仅用 items(或 orderedItems)全部序列化。这种情况下,Collection 内项目可划分为不同的子集或“分页”。分页以 CollectionPage 类型表示。

CollectionPage 类型继承自 Collection,拥有全部父类型属性。此外还可以指定以下附加属性: partOf | next | prev |

partOf 属性用于标识 CollectionPage 中子项隶属于的 Collection

firstnextprevlastcurrent 属性用于引用父集合其它包含子集的 CollectionPage 实例。

Collection 对象一样,CollectionPage 的条目可有序也可无序。OrderedCollectionPage 类型 可以用于声明分页中的条目严格按顺序排列。

OrderedCollectionPage 类型同时扩展自 CollectionPage OrderedCollection 。除了继承各自属性,OrderedCollectionPage 还可包含附加 startIndex 属性,表示本页首项在所属 OrderedCollection 中的相对序号。

20 Collection、OrderedCollection、CollectionPage 和 OrderedCollectionPage 之间关系的示意图:
Collection type Model

无论有序还是无序,一个 Collection 的分页通常按顺序组织(单向或双向链表)。first 用于指向序列中的第一页,last 用于指向序列末页,prevnext 分别指向前一页和后一页。

21 Collection 分页模型示意图:
The Paging Model

current 属性用于指向 Collection 当前最新创建或更新子项所在的分页。

firstlastnextprevcurrent 属性的值既可为单个 CollectionPage ,也可为一个 Link,指向包含 CollectionPage 的独立资源。

22 一个带分页功能的简单无序集合示例:
示例 20
{
  "@context": "https://www.w3.org/ns/activitystreams",
  "summary": "Sally's recent activities",
  "type": "Collection",
  "id": "http://example.org/foo",
  "totalItems": 10,
  "first": {
    "type": "CollectionPage",
    "id": "http://example.org/foo?page=1",
    "partOf": "http://example.org/foo",
    "next": "http://example.org/foo?page=2",
    "items": [
      {
        "type": "Create",
        "actor": "http://www.test.example/sally",
        "object": "http://example.org/foo"
      }
    ]
  }
}

OrderedCollection 上使用分页较为复杂,因为对于分页顺序的实际处理没有强制保证。希望还原成员完整顺序的实现应优先获取整个序列的第一页(或最后一页),然后递归跟随 next(或 prev)链接直至遍历所有分页。OrderedCollection 的分页 建议 都为 OrderedCollectionPage 实例;若不是,消费端将无法可靠地复原正确次序。

4.7 自然语言值

词汇表中有多个属性被定义为自然语言值。这些是用一种或多种语言书写的人类可读字符串。在 JSON 序列化中,它们可以表示为:(1) 单一 JSON 字符串,或 (2) 一个 JSON 对象,将规范 [BCP47] 语言标签映射到同一字符串的各地化等价翻译。在序列化 JSON 里,通过简单的属性命名规则区分这两种形式,例如:"name" 代表 name 属性的字符串形式,而 "nameMap" 代表对象形式。

23 未指定语言信息的单一 name 字符串值:
示例 21
{
  "@context": "https://www.w3.org/ns/activitystreams",
  "type": "Object",
  "name": "This is the title"
}
24 多语言特定值:
示例 22
{
  "@context": "https://www.w3.org/ns/activitystreams",
  "type": "Object",
  "nameMap": {
    "en": "This is the title",
    "fr": "C'est le titre",
    "es": "Este es el título"
  }
}

对象形式中的每个键必须是规范的 [BCP47] 语言标签。对应的值必须是字符串。

活动词汇表定义了三种使用自然语言值的属性: namesummarycontent。因此,在 JSON 序列化中," name"、"summary" 和 "content" 表示字符串形式;" nameMap"、"summaryMap" 和 " contentMap" 表示对象形式。

对于语言未知或未确定的值,对象形式中可以显式用特殊语言标签 "und" 进行标识。

25 使用 "und" 语言标签:
示例 23
{
  "@context": "https://www.w3.org/ns/activitystreams",
  "type": "Object",
  "nameMap": {
    "und": "This is the title"
  }
}

4.7.1 默认语言上下文

当使用 [JSON-LD] 机制生产或消费 Activity Streams 2.0 文档时,可以在 @context 中使用 @language 属性可选用来标识默认语言。对于未选择用 JSON-LD 方式处理 Activity Streams 2.0 文档的实现,此机制可能无法识别。

26 在 JSON-LD @context 中指定默认 "@language"
示例 24
{
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    {
      "@language": "en"
    }],
  "type": "Object",
  "name": "This is the title"
}

4.7.2 双向文本

Activity Streams 2.0 文档中的自然语言值可以包含双向文本。Activity Streams 2.0 文档的默认基向是从左到右。单个自然语言值的基向可以按下述方式进行调整。

指定自然语言值的双向文本时,如果文本基向无法通过首个强方向字符正确识别,出版者应当通过在值前添加适当的 Unicode 双向控制字符,或在允许时使用 HTML 方向标记来显式说明默认方向。

处理包含双向文本的 Activity Streams 2.0 文档的消费者应当通过扫描文本中第一个(不在标记内的)强方向字符或者利用已提供的方向标记来识别基向。一旦确定了基向,消费者必须依据 Unicode 双向算法 [BIDI] 正确渲染并显示自然语言值。为应用基向,这可能需要在显示前向字符串包裹额外控制字符或标记。

属性 方向 方式
name "פעילות הבינאום, W3C" 从右到左 首个强方向字符
name "The document was titled, '\u2067פעילות הבינאום, W3C\u2069'" 从左到右 首个强方向字符
name "\u200FHTML היא שפת סימון" 从右到左 双向控制字符
name "\u200E'שלום' is hello in Persian." 从左到右 双向控制字符
summary <p dir=\"rtl\">HTML היא שפת סימון>/p> 从右到左 HTML 标记
summary <p>פעילות הבינאום, W3C</p> 从右到左 首个强方向字符(忽略标记)
summary <p title="سلام">Hello</p> 从左到右 首个强方向字符(忽略标记)

4.8 语言标记

若已知,Activity Streams 2.0 发布者应当显式标记自然语言属性的语言,可使用 map 属性或默认语言标签。

: 示例

本规范中的示例并非全部都显式标记了自然语言属性的语言。这是有意为之。作者和工作组希望避免实施者直接复制粘贴带有显式语言标记的示例作为新文档模板,导致语言标记不准确。

5. 可扩展性

在 Activity Streams 2.0 中,“扩展”指的是任何未被活动词汇表定义的属性、活动、参与者或对象类型。消费端实现如果遇到不认识的扩展,不得中止处理或报错,并且必须像这些属性不存在一样继续处理。需注意,不同实现对扩展的支持程度可能不同,并且未对扩展定义规范的处理模型。因此,过度依赖扩展的实现可能会降低与其它实现的互操作性。

对于扩展, [JSON-LD] 被用作定义和消歧扩展的首选机制。希望完整支持扩展的实现建议使用 [JSON-LD] 机制。

部分流行的扩展已被收录于 Activity Streams 2.0 命名空间文档,可在 https://www.w3.org/ns/activitystreams#extensions 查阅。Social Web Incubator Community Group 维护了一份关于Activity Streams 扩展的 wiki 页面。

需要注意的是,JSON-LD 处理算法 [ JSON-LD-API],按当前定义,会静默忽略任何未在 JSON-LD @context 中定义的属性。因此,发布包含扩展属性的 Activity Streams 2.0 文档的实现应当为所有扩展提供 @context 定义。

还需注意,有些合法的 JSON 结构不能用在 JSON-LD 文档中。例如,JSON-LD 禁止“数组的数组”(如流行的 GeoJSON 规范所用)。虽然实现可以在 Activity Streams 2.0 文档中自由用作扩展,但采用标准 JSON-LD 处理的消费端要么需忽略这些扩展,要么需在应用 JSON-LD 算法前将其映射为兼容结构。例如简单 GeoJSON 点可映射为 Place 对象,较复杂几何体可转换为 GeoSparql Well-Known Text,见下方非规范示例:

27 GeoJSON 点坐标:
示例 25
{
  "type": "Point",
  "coordinates": [36.74, -119.77]
}
28 等价 Place 表达:
示例 26
{
  "@context": "https://www.w3.org/ns/activitystreams",
  "name": "Fresno, California",
  "type": "Place",
  "latitude": 36.74,
  "longitude": -119.77
}
29 GeoJSON 多边形坐标:
示例 27
{
  "type": "Polygon",
  "coordinates": [
    [
      [100.0, 0.0],
      [101.0, 0.0],
      [101.0, 1.0],
      [100.0, 1.0],
      [100.0, 0.0]
    ]
  ]
}
30 等价 GeoSparql Well-Known-Text 表达:
示例 28
{
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    {"gsp": "http://www.opengis.net/ont/geosparql"}
  ],
  "summary": "A polygon",
  "type": "gsp:Geometry",
  "gsp:asWKT": "Polygon((100.0, 0.0, 101.0, 0.0, 101.0, 1.0, 100.0, 1.0, 100.0, 0.0))"
}

5.1 紧凑 URI 支持

JSON-LD 语法支持“紧凑 URI”的用法。紧凑 URI 利用已定义前缀对 URI 进行简化编码。例如,URI http://example.org/term 可通过分配 ex: 前缀为 http://example.org/,写作 ex:term

在 JSON-LD 中,紧凑 URI 前缀在 @context 定义内声明。例如:

31 JSON-LD 紧凑 URI 定义
示例 29
{
"@context": {
"ex": "http://example.org/",
"term": {
  "@type": "id",
  "@id": "ex:term"
}
},
"term": "ex:Foo"
}

在此例中,属性名 term 和属性值 ex:Foo 都是紧凑 URI。属性名 term 展开为 http://example.org/term,属性值 ex:Foo 展开为 http://example.org/Foo

在 JSON-LD 中,紧凑 URI 的值展开适用于 @context 定义中明确指定为 "type": "id" 的属性。即,紧凑 URI 可用于所有期望 IRI(或 URI)值的场合。

希望完整支持扩展的 Activity Streams 2.0 实现必须支持符合 JSON-LD 规范的紧凑 URI 展开。该展开适用于所有属性名,以及所有在 JSON-LD @context 中明确定义类型为 @id 的属性值。

过度依赖紧凑 URI 形式会导致不同实现之间歧义和兼容性问题。因此,除属性名和 type 属性值之外的用法,建议避免使用紧凑 URI。

5.2 扩展的再序列化

如果实现用 JSON-LD 机制解析带有扩展属性的 Activity Streams 2.0 文档并将其重新序列化,建议应保证原文档内的扩展属性被正确保存和序列化。

例如,以下为包含假想扩展属性 foobar 的简单 Activity Stream 对象。foo 扩展在 JSON-LD @context 中定义,bar 没有。

32 简单扩展对象
示例 30
{
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    {"foo": "http://example.org/foo"}
  ],
  "type": "Note",
  "content": "This is a simple note",
  "foo": 123,
  "bar": 321
}

收到该 Note 对象,实现可以选择作为普通 JSON 对象解析,或使用标准的 JSON-LD 扩展算法。

如果以普通 JSON 解析并再序列化(如用于存储或转发),只需简单保留 @contextfoobar 属性及其值。

如果采用 JSON-LD 扩展算法,@context 会在扩展结果中被移除,bar 属性会被映射为“空白节点” _:bar。如用 Activity Streams 2.0 规范上下文再序列化,JSON-LD 压缩之后形式如下:

33 压缩后再序列化形式:
示例 31
{
  "@context": "https://www.w3.org/ns/activitystreams",
  "type": "Note",
  "content": "This is a simple note",
  "http://example.org/foo": 123,
  "bar": 321
}

虽已接近原文,但 foo 属性变为完全展开的 URI 形式并不理想。为保证再序列化对象正确,采用 JSON-LD 扩展的实现建议在扩展时保留原始 @context,并在 JSON-LD 再压缩时复用之。

6. 隐私考量

Activity Streams 2.0 文档可能(并且很可能)包含潜在敏感的个人信息,如身份、联系方式、地理位置、身体特征等。此外,一般来说,活动数据可被分析后生成针对个人或参与者群体的行为画像。

生产或消费 Activity Streams 2.0 文档的实现 必须采取措施,面向所有潜在用户开放透明地记录和传达以下信息:(a) 实现发布、消费或收集的潜在敏感个人信息类型,(b) 发布、消费和收集这些信息的理由,(c) 信息的使用方式,(d) 与哪些其他方共享这些信息,以及 (e) 与他方共享信息的理由。

发布 Activity Streams 2.0 文档的实现 建议,除非用户已“选择同意”共享更多信息,否则默认应尽量限制文档中敏感个人信息的种类和数量。

消费 Activity Streams 2.0 文档的实现 不建议默认存储或共享文档内的敏感个人信息,除非用户明确“选择同意”允许存储或共享此类信息。

在此语境下,“选择同意”并不一定要求用户明确操作。如果,举例来说,敏感个人信息的使用在使用某些服务(如定位跟踪服务)时已经隐含,那么只要实现上述文档指引条款,任何使用该服务的行为都可视为用户已隐含认可该敏感信息会被使用和共享。

7. 安全考量

作为公共数据流实现 Activity Streams 的发布方或消费方,也应考虑收到的内容中可能存在的垃圾商业信息或恶意内容,应主动采取措施识别这类内容,并加以标识或避免将其包含于实现中。

发布者应合理防范恶意用户输入,比如防止跨站脚本攻击等信息被包含到发布的 Activity Streams 数据中。

对于向终端用户重新发送(re-emit)摄取内容的消费者,必须采取合理措施,确保摄取的内容中有潜在恶意的输入不会被转发。

对于将摄取内容重新分发给搜索引擎爬虫的消费者,应合理限制其站点被用作搜索引擎优化漏洞,包括将不可信超链接转为文本或添加 rel="nofollow" 属性等手段。

消费者应当关注伪造攻击的风险,攻击者可能发布带有伪造属性值的活动或对象,以注入恶意内容、隐藏或破坏真实内容,或误导用户。

Activity Streams 是 JSON 文档,需要遵循 [RFC7159] 所述的安全考虑。

Activity Streams 实现要处理 URI。详见 [ RFC3986] 第 7 节。

Activity Streams 实现要处理 IRI。详见 [ RFC3987] 第 8 节。

8. IANA 注意事项

8.1 application/activity+json 媒体类型

本规范注册了 application/activity+json 媒体类型专门用于标识符合 Activity Streams 2.0 格式的文档。

主类型(Type name): application
子类型(Subtype name): activity+json
必需参数(Required parameters):
可选参数(Optional parameters): profile: "application/activity+json" 的 profile 参数允许指定一个或多个 profile URI。profile URI 具备 [RFC6906] 中定义的标识符语义。"profile" 参数必须加引号。它包含一个非空、用空格分隔的 URI 列表(profile URI)。
profile-param = "profile=" profile-value
profile-value = <"> profile-URI 0*( 1*SP profile-URI ) <">
profile-URI   = URI
上述语法中的“URI”指的是 [RFC3986] 第 3 节定义的“URI”。
编码注意(Encoding considerations): 使用 "application/activity+json" 媒体类型的资源需满足 "application/json" 媒体类型的所有要求,因此遵循 [RFC7159] 第 11 节中关于编码的注意事项。
安全注意(Security considerations): 如本规范所述。
联系方式(Contact): James M Snell <jasnell@gmail.com>

请注意,虽然 Activity Streams 2.0 格式采用 JSON-LD 规范,但为 Activity Streams 2.0 实现增加了多个限制和要求,故需要独立媒体类型。

由于 Activity Streams 2.0 可视为 JSON-LD 的受限特型,实现建议把 `application/ld+json; profile="https://www.w3.org/ns/activitystreams"` 媒体类型视为等效于 `application/activity+json`。

9. 一致性

本规范中的所有图示、示例、注释以及明确标为非规范的章节均为非规范内容。其余部分均为规范内容。

9.1 文档

一致性文档是指完全符合所有文档级一致性标准的文档。为了便于阅读,部分一致性要求表述为发布方应当遵守,但实际上这些要求皆视为对文档的要求,因为所有文档都假定有发布者。

一致性文档不得包含 Activity Streams 1.0 的弃用或过时语法,必须包含活动词汇表中的属性与类型。使用其他词汇表的一致性文档还必须包含等价的活动词汇表属性与类型(详见 C 节)。一致性文档不得使用本规范禁止的 JSON-LD 或其它序列化特性(详见第2节)。超出 Activity Streams 2.0 词汇定义的类型或属性,须用第5节定义的扩展机制。

一致性文档举例(包括但不限于):

9.2 实现

一致性实现是指任何发布、存储、分析、消费或以其他方式处理一致性文档的软件。主要有发布方和消费方两类。

9.2.1 发布者

一致性发布者为生成并发布一致性文档的实现。发布者必须按照第2节的序列化要求发布一致性文档,必须考虑第6节所述的隐私问题,必须考虑第7节所述的安全问题。

发布者举例(包括但不限于):

  • 社交网络
  • 个人网站
  • 文档发布系统
  • 来自非一致性社交网络的桥接
  • 从类似文档类型(如 RSS 或 Atom)的转换器

9.2.2 消费者

一致性消费者是指读取和分析一致性文档的实现。消费者必须容忍 Activity Streams 1.0 的弃用或过时属性或类型,必须忽略那些与自身应用领域无关的属性或类型。

消费者可将一致性文档重新发布为其他数据格式,也可以用屏幕、打印、音频或其它方式将文档展示给用户。消费者必须如实准确地将文档信息转换为这些格式或媒介。重新发布一致性文档的消费者必须考虑第6节所述隐私问题和第7节所述安全问题。

消费者举例(包括但不限于):

  • 社交网络
  • 搜索引擎
  • 信息订阅器
  • 文档校验工具
  • 信息聚合器
  • 统计分析软件

A. 致谢

Activity Streams 2.0 规范是 W3C 社交网络工作组(Social Web Working Group)的成果。编辑组感谢所有为本规范的讨论、议题、测试做出贡献的工作组成员。

编辑还要感谢所有在规范成为 W3C 社交网络工作组贡献前帮助推动 Activity Streams 的人。Activity Streams 1.0 由社区驱动努力实现,没有社区前期的贡献(包括但不限于:Abdul Qabiz、Adina Levin、Adrian Chan、Adriana Javier、Alan Hoffman、Alex Kessinger、Alexander Ovchinnikov、Alexander Zhuravlev、Alexandre Loureiro Solleiro、Amy Walgenbach、Andres Vidal、Angel Robert Marquez、Ari Steinberg、Arjan Scherpenisse、Arne Roomann-Kurrik、Beau Lebens、Ben Hedrington、Ben Metcalfe、Ben Werdmuller、Benjamin Goering、Bill de hOra、Bo Xing、Bob Aman、Bob Wyman、Brett Slatkin、Brian Walsh、Brynn Evans、Charlie Cauthen、Chris Chabot、Chris Messina、Chris Toomey、Christian Crumlish、Dan Brickley、Dan Scott、Daniel Chapman、Danny Ayers、Dare Obasanjo、Darren Bounds、David Cramer、David Nelson、David Recordon、DeWitt Clinton、Douglas Pearce、Ed Summers、Elias Bizannes、Elisabeth Norris、Eric Marcoullier、Eric Woods、Evan Prodromou、Gee-Hsien Chuang、Greg Biggers、Gregory Foster、Henry Saputra、Hillary Madsen、Howard Liptzin、Hung Tran、Ian Kennedy、Ian Mulvany、Ivan Pulleyn、Jacob Kim、James Falkner、James Pike、James Walker、Jason Kahn、Jason Kantz、Jeff Kunins、Jeff Martin、Jian Lin、Johannes Ernst、John Panzer、Jon Lebkowsky、Jon Paul Davies、Jonathan Coffman、Jonathan Dugan、Joseph Boyle、Joseph Holsten、Joseph Smarr、Josh Brewer、Jud Valeski、Julien Chaumond、Julien Genestoux、Jyri Engestroem、Kaliya Hamlin、Kevin Marks、Laurent Eschenauer、Laurie Voss、Leah Culver、Libby Miller、Manu Mukerji、Mark Weitzel、Marko Degenkolb、Marshall Kirkpatrick、Martin Atkins、Martin Svensson、Marty Alchin、Mary Hoder、Matt Leventi、Matt Wilkinson、Matthias Mueller-Prove、Max Engel、Max Wegmueller、Melvin Carvalho、Michael Buckbee、Michael Chan、Michael Richardson、Michael Sullivan、Mike Macgirvin、Mislav Marohnić、Mo Jangda、Monica Wilkinson、Nate Benes、NeilFred Picciotto、Nick Howard、Nick Lothian、Nissan Dookeran、Nitya Narasimhan、Pablo Martin、Padraic Brady、Pat Cappelaere、Patrick Aljord、Peter Ferne、Peter Reiser、Peter Saint-Andre、Phil Wolff、Philip (flip) Kromer、Richard Cunningham、Richard Zhao、Rick Severson、Robert Hall、Robert Langbert、Robert Dolin、Robin Cover、Ryan Boyd、Sam Sethi、Scott Raymond、Scott Seely、Simon Grant、Simon Wistow、Stephen Garcia、Stephen Sisk、Stephen Paul Weber、Steve Ivy、Steve Midgley、Steven Livingstone-Perez、Sylvain Carle、Sylvain Hellegouarch、Tantek Çelik、Tatu Saloranta、Tim Moore、Timothy Young、Todd Barnard、Tosh Meston、Tyler Gillies、Will Norris、Zach Copley、Laurent-Walter Goix、Matthew Marum、Andy Smith、Zach Shepherd),规范不会有今天这样的成果。

B. 废弃的 Activity Streams 1.0 语法

本节为非规范性内容。

注:本附录为非规范内容,但会使用如 必须 这类规范术语。此类术语用于指明,如果实现者选择实现本附录所述的 Activity Streams 1.0 向后兼容模型,则需满足某些规范性要求。

尽管本规范定义的语法与 JSON Activity Streams 1.0 有所不同,但 1.0 规范中定义的基本模型依然保留。本规范定义了允许现有 Activity Streams 1.0 文档映射并作为 Activity Streams 2.0 文档处理的处理规则。

本规范定义的 JSON 语法与原始 JSON Activity Streams 1.0 [ AS1] 规范中的定义有所不同,并且不具备向后兼容性。实现可以选择继续支持 JSON Activity Streams 1.0 语法,但该语法已被弃用。这意味着实现仍可继续消费 1.0 语法,但不应输出 1.0 语法,除非是专门与旧的非 2.0 兼容实现交互时。

具体来说:

  1. 实现可在生成 Activity Streams 1.0 语法的 JSON 序列化时使用 "application/stream+json" MIME 类型,使用 2.0 语法时则用 "application/activity+json"。
  2. 处理带有 "application/stream+json" 或更通用的 "application/json" MIME 类型的序列化时,实现必须遵循 [AS1] 的语法和处理规则。2.0 语法及规则只适用于 "application/activity+json" 类型。
  3. 当用 JSON-LD 处理模型处理 Activity Streams 1.0 文档时,实现可用 此处提供的 AS 1.0 向 AS 2.0 扩展 @context 定义,生成 JSON-LD 展开表达。详见 JSON-LD 处理算法与 API
  4. 处理并转换 Activity Streams 1.0 文档为 2.0 时,应视 id 为 JSON-LD @id 关键字的等价别名, objectTypeverb 属性为 JSON-LD @type 关键字的别名。
  5. Activity Streams 1.0 使用 displayName 属性,而在 Activity Streams 2.0 已重命名为 name。实现应视 displayNamename 的等价别名。
  6. Activity Streams 1.0 使用 title 属性,但在 2.0 中已移除。处理 Activity Streams 1.0 文档时遇到 title 属性应视为扩展。
  7. 本规范将 contentsummary 属性重新定义为自然语言值,即其值既可为字符串也可为对象(语言标签到字符串的映射)。1.0 语法只允许字符串。由于 1.0 值为本规范允许的合法子集,实现无需特殊处理即可继续支持。
  8. 本规范将大量原定义为 1.0 对象的通用属性重新定义为 ObjectLink。JSON-LD 序列化允许此类属性值为 IRI 字符串、JSON 对象,或 IRI 字符串与对象数组。由于 1.0 值为合法子集,现有实现无需特殊处理即可继续支持。
  9. 本规范弃用 Activity Streams 1.0 的 upstreamDuplicatesdownstreamDuplicates 属性,也不提供替代。原因主要是缺乏实际实现支持。虽仍 可以继续使用上述属性,但实现 应当避免。
  10. Activity Streams 1.0 的 "post" 动词既描述对象创建也包含“发布”或上传到某服务等行为。本规范分别用 CreateAdd 活动类型取代。当处理和转换 1.0 文档时,对于 "post" 动词,应当这样处理:如无 target 属性则视为 Create,如有 target 属性则视为 Add

按上述规则,所有 JSON Activity Streams 1.0 序列化都可被 2.0 实现正确处理。

C. 多词汇表使用示例

本节为非规范性内容。

可以使用多个词汇表覆盖活动的部分特征,如数据溯源和注解,以补充 Activity Vocabulary。例如:Eric 写了一条便条分享给粉丝,发布后发现拼写有误,便修正后重新发布。后来 Eric 认为该便条内容不准确,于是又将其删除。

34 一系列活动:创建、编辑、删除便条。
示例 32
{
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    {
      "oa": "http://www.w3.org/ns/oa#",
      "prov": "http://www.w3.org/ns/prov#",
      "dcterms": "http://purl.org/dc/terms/",
      "dcterms:created": {
        "@id": "dcterms:created",
        "@type": "xsd:dateTime"
      }
    }
  ],
  "summary": "Editing history of a note",
  "type": "Collection",
  "items": [
    {
      "id": "http://example.org/activity/20150101000000",
      "type": [ "Create", "prov:Activity" ],
      "actor": {
        "id": "http://example.org/#eric",
        "name": "Eric"
      },
      "summary": "Eric wrote a note.",
      "object": {
        "id": "http://example.org/entry/20150101000000",
        "type": [ "Note", "prov:Entity" ],
        "attributedTo": "http://example.org/#eric",
        "content": "Remember... all I'm offering is the trooth. Nothing more."
      },
      "published": "2015-01-01T00:00:00Z"
    },
    {
      "id": "http://example.org/activity/20150101000059",
      "type": [ "Update", "prov:Activity", "oa:Annotation" ],
      "summary": "Eric edited a note.",
      "dcterms:created": "2015-01-01T00:00:59Z",
      "dcterms:creator": { "@id": "http://example.org/#eric" },
      "oa:hasBody": {
        "id": "http://example.org/entry/20150101000059",
        "type": [ "Note", "prov:Entity" ],
        "content": "Remember... all I'm offering is the truth. Nothing more.",
        "prov:wasAttributedTo": { "@id": "http://example.org/#eric" },
        "prov:wasRevisionOf": { "@id": "http://example.org/entry/20150101000000" }
      },
      "oa:hasTarget": { "@id": "http://example.org/entry/20150101000000" },
      "oa:motivatedBy": { "@id": "oa:editing" },
      "prov:generated": { "@id": "http://example.org/entry/20150101000059" },
      "prov:wasInformedBy": { "@id": "http://example.org/activity/20150101000000" }
    },
    {
      "id": "http://example.org/activity/20150101010101",
      "type": [ "Delete", "prov:Activity" ],
      "actor": "http://example.org/#eric",
      "summary": "Eric deleted a note.",
      "object": "http://example.org/entry/20150101000059",
      "published": "2015-01-01T01:01:01Z"
    }
  ]
}

D. 变更记录

本节为非规范性内容。

自上一个候选推荐标准版本 2016-12-15 以来,本规范做了如下重要更改。

E. 图表目录

F. 参考文献

F.1 规范性引用

[BCP47]
Tags for Identifying Languages(语言标识标签)。A. Phillips;M. Davis。IETF。2009 年 9 月。IETF 最佳实践。URL: https://tools.ietf.org/html/bcp47
[BIDI]
Unicode Bidirectional Algorithm(Unicode 双向算法)。Mark Davis;Aharon Lanin;Andrew Glass。Unicode Consortium。2016年5月18日。Unicode 标准附件 #9。URL: http://www.unicode.org/reports/tr9/tr9-35.html
[HTML5]
HTML5。Ian Hickson;Robin Berjon;Steve Faulkner;Travis Leithead;Erika Doyle Navara;Theresa O'Connor;Silvia Pfeiffer。W3C。2014年10月28日。W3C 推荐标准。URL: https://www.w3.org/TR/html5/
[JSON-LD]
JSON-LD 1.0。Manu Sporny;Gregg Kellogg;Markus Lanthaler。W3C。2014年1月16日。W3C 推荐标准。URL: https://www.w3.org/TR/json-ld/
[JSON-LD-API]
JSON-LD 1.0 Processing Algorithms and API。Markus Lanthaler;Gregg Kellogg;Manu Sporny。W3C。2014年1月16日。W3C 推荐标准。URL: https://www.w3.org/TR/json-ld-api/
[RFC2119]
Key words for use in RFCs to Indicate Requirement Levels。S. Bradner。IETF。1997年3月。最佳实践。URL: https://tools.ietf.org/html/rfc2119
[RFC3339]
Date and Time on the Internet: Timestamps。G. Klyne;C. Newman。IETF。2002年7月。标准草案。URL: https://tools.ietf.org/html/rfc3339
[RFC3986]
Uniform Resource Identifier (URI): Generic Syntax。T. Berners-Lee;R. Fielding;L. Masinter。IETF。 2005年1月。Internet 标准。URL: https://tools.ietf.org/html/rfc3986
[RFC3987]
Internationalized Resource Identifiers (IRIs)。M. Duerst;M. Suignard。IETF。2005年1月。标准草案。URL: https://tools.ietf.org/html/rfc3987
[RFC5988]
Web Linking。 M. Nottingham。IETF。2010年10月。标准草案。URL: https://tools.ietf.org/html/rfc5988
[RFC6906]
The 'profile' Link Relation Type。E. Wilde。IETF。2013年3月。信息类文档。URL: https://tools.ietf.org/html/rfc6906
[RFC7159]
The JavaScript Object Notation (JSON) Data Interchange Format。T. Bray, Ed.. IETF。2014年3月。标准草案。URL: https://tools.ietf.org/html/rfc7159

F.2 参考性引用

[ABNF]
Augmented BNF for Syntax Specifications: ABNF。D. Crocker, Ed.; P. Overell。IETF。2008年1月。Internet 标准。URL: https://tools.ietf.org/html/rfc5234
[AS1]
JSON Activity Streams 1.0。J. Snell;M. Atkins;W. Norris;C. Messina;M. Wilkinson;R. Dolin。http://activitystrea.ms。非正式文档。URL: http://activitystrea.ms/specs/json/1.0/
[SWP]
Social Web Protocols。A. Guy。URL: https://www.w3.org/TR/social-web-protocols/
[vcard-rdf]
vCard Ontology - for describing People and Organizations。Renato Iannella;James McKinney。W3C。2014年5月22日。W3C Note。URL: https://www.w3.org/TR/vcard-rdf/