公開後に報告されたエラーや問題については、正誤表をご確認ください。
この仕様の英語版のみが正式な規範版です。非規範的な翻訳が利用できる場合があります。
Copyright © 2017 W3C® (MIT, ERCIM, Keio, Beihang). W3C liability, trademark and permissive document license rules apply.
この仕様書は、JSONフォーマットを用いて潜在的および完了したアクティビティを表現するためのモデルを詳細に述べています。アクティビティの構造を詳細にし、特定のアクティビティタイプを定義するボキャブラリーと組み合わせて使用されることを意図しています。
このセクションは本ドキュメントの公開時点における位置付けを説明します。他の文書がこの文書に取って代わる場合があります。現在のW3C公開文書およびこの技術レポートの最新版はW3C技術レポートインデックス(https://www.w3.org/TR/)で確認できます。
この文書はSocial Web Working Groupによって勧告として公開されました。この文書に関するコメントは歓迎しています。ご意見は public-socialweb@w3.org(購読、 アーカイブ)までお送りください。
ワーキンググループの実装レポートもご参照ください。
本文書はW3Cメンバー、ソフトウェア開発者、他のW3Cグループおよび関係者によってレビューされ、またディレクターによりW3C勧告として承認されています。これは安定した文書であり、リファレンスマテリアルや他文書からの引用に使用できます。W3Cの勧告発行の役割は、この仕様へ注目を集め、その広範な導入を推進することにあります。これによりウェブの機能性と相互運用性が高まります。
この文書は、 2004年2月5日 W3C特許ポリシーのもとで運用されるグループにより作成されました。 W3Cは、本グループの成果物に関連してなされた特許開示の公開リストを管理しています。特許の開示方法もそのページでご案内しています。実際に必須特許だと考えられる特許情報を有する個人は、その情報をW3C特許ポリシー第6節に従って開示する必要があります。
本ドキュメントは2017年3月1日 W3Cプロセス文書に従って管理されています。
最も基本的な意味において、「アクティビティ」とは動作のセマンティックな記述です。本仕様の目的は、アクティビティに関するメタデータをリッチで人に優しく、かつ機械的に処理可能かつ拡張可能な方法で表現するのに十分なJSONベースの構文を提供することです。これには、アクティビティの自然言語による説明や視覚的表現の構築、さまざまな種類のオブジェクトへのアクションに関する情報の関連付け、アクティビティログの伝達または記録、もしくは他のアプリケーションへの潜在的なアクションの委任などが含まれます。
本ドキュメントにおける "MUST(必須)"、"MUST NOT(禁止)"、"REQUIRED(必須)"、"SHALL(すべき)"、"SHALL NOT(してはならない)"、" SHOULD(推奨)"、"SHOULD NOT(非推奨)"、 "RECOMMENDED(推奨)"、"MAY(してもよい)"、および "OPTIONAL(任意)" というキーワードは [RFC2119] の記述通りに解釈されます。
このセクションは規範的ではありません。
Activity Streams 2.0はソーシャルデータ構文に適しています。[SWP] 関連標準群の一部です。
このセクションは規範的ではありません。
JSON Activity Streams 1.0 [AS1] 仕様は、2011年5月に公開され、完了したアクティビティ表現のための拡張可能な基本構文を提供しました。本仕様は、その初期の基盤の上に、幅広い実装経験、コミュニティからのフィードバック、他コミュニティの関連作業を取り入れて構築されています。
特にActivity Streams 2.0がActivity Streams 1.0から進化するきっかけとなった課題には、次のようなものがあります:
displayName, verb,
title, objectType の用語は、Activity Streams 2.0ドキュメント内では予約語として使用しない方がよいものとみなしてください。もしActivity Streams 2.0ドキュメント内で使用されている場合は、
ガイドラインに従い処理してください。
B. 非推奨となったActivity Streams 1.0構文 を参照してください。
本仕様は、[RFC7159]に基づき、[JSON-LD]構文制約のサブセットに準拠しながら、JSON-LD処理を必須としない Activity Vocabulary のためのJSONベースのシリアライズ構文を規定します。他のシリアライズ形式も可能ですが、本ドキュメントではそれらについては扱いません。
シリアライズ時、プロパティの値が存在しない場合、(a) 値をnullに設定する、または (b)プロパティ自体を省略するという2つの方法で表現できます。どちらも意味的には同一です。もし配列プロパティの値が配列で項目が存在しない場合、その配列のプロパティを省略またはnullにする必要があります。省略または明示的なnull値は、「値が空・nilである」ではなく「値が割り当てられていない」と解釈されます。
Activity Streams
ドキュメント とは、ルート値が任意の型のActivity Streams Object(Collection を含む)であり、MIMEメディアタイプが "
application/activity+json" であるJSONドキュメントを指します。
Activity Streams 2.0ドキュメントはUTF-8文字エンコーディングでシリアライズされなければなりません。
シリアライズされたActivity Streams 2.0ドキュメントのJSON形式は、標準のJSON-LD 1.0 Processing AlgorithmsおよびAPI [JSON-LD-API] のCompaction Algorithmによって、少なくとも 規範的なJSON-LD @context定義 を使用した場合と同じ結果になる必要があります。実装は@contextに追加の定義を加えても規範コンテキストの上書き・変更はしてはなりません。標準JSON-LDアルゴリズムを利用する実装でサポートされない追加プロパティや値も利用可能ですが、その場合それらプロパティは無視される可能性が高いです。拡張の扱いについては拡張性セクションを参照してください。
JSON-LDは@contextプロパティを使ってプロセッシングコンテキストを定義します。@contextプロパティの値は
[JSON-LD] 仕様に従って与えられます。Activity Streams
2.0ドキュメントを生成する実装は、@contextプロパティに Activity Streams 2.0 JSON-LD @context定義
への参照を含めるべきです(値は "
https://www.w3.org/ns/activitystreams")。"http://www.w3.org/ns/activitystreams" を使っても構いません。文字列・オブジェクト・配列のいずれでも指定できます。
{
"@context": "https://www.w3.org/ns/activitystreams",
"summary": "A note",
"type": "Note",
"content": "My dog has fleas."
}
@vocab キーワードおよび拡張用プレフィックスを使い、オブジェクトとしてcontextを提供するドキュメント例
{
"@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"
}
{
"@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ドキュメントに@contextプロパティがなく、かつ値に規範的な@context定義への参照が含まれない場合でも、規範@context定義が適用されるものとみなさなければなりません。
本仕様ではIRIs([RFC3987])を使用します。全てのURI([RFC3986])はIRIでもあるため、IRIが求められる箇所ではURIも使えます。特に留意すべき2点:(1)デリファレンス用にIRIが指定されてURIでない場合は、[RFC3987] 3.1節の手順でURIに変換しなければならない、(2)IRIが"id"値として用いられる場合はそのような変換をしてはならない。
相対IRI(およびURL)参照は、多くのJSONパーサ実装がベースコンテキストを正しく維持できず、相対参照の解決が信頼できないため、Activity Streams 2.0ドキュメント内で使用しないことを推奨します。
日付および時刻値を持つ全てのプロパティは、[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` コンポーネントはタイムゾーンとは一致しないことに注意してください。この部分を含む時刻はタイムスタンプ用には適しますが、ローカル時刻への変換には追加情報や処理が必要です。
このセクションは規範的ではありません。
以下は詳細レベルの異なる3つのアクティビティ例です。
各例では、本仕様で定義された標準的なJSONシリアライズ形式を用いて示しています。
'http://www.test.example/martin' が 'http://example.org/foo.jpg' を作成しました
という内容を表す。追加詳細はありません。
{
"@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"
}
{
"@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"
}
}
{
"@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"
}
}
}
]
}
アクティビティ語彙は、Activity Streams 2.0のコアオブジェクトタイプとプロパティを規範的に定義しています。
この語彙で定義されるオブジェクトタイプは、8つのコアタイプのセットと、多くのソーシャルWebアプリケーションで共通して使われるActivityおよびObjectの拡張セットに分割されています。コアタイプには以下が含まれます:
OrderedCollection、CollectionPage、
およびOrderedCollectionPage。
Activity Streams 2.0 ドキュメント内のすべてのJSONオブジェクトは、
Object
または
Link
です。その他の語彙で定義された型や拡張型は、これら2つのベース型から派生しています。
Activity Streams 2.0 ドキュメントのJSONオブジェクトは、
(a) type プロパティの値として"Link"を含む場合、または(b) type プロパティ値に含まれる型のいずれかが Link の拡張であると定義されている場合(例: Mention 参照)、それは
Link
となります。それ以外の場合、そのJSONオブジェクトは
Object
のインスタンスまたは拡張とみなします。
Object はActivity
Streams語彙の主たるベース型です。
全ての Object 型はグローバル識別子(id プロパティで絶対IRIとして示す)および"オブジェクト型"(type
プロパティで示す)に加え、アクティビティ語彙で規範的に定義される共通のプロパティ群を持ちます。これには次が含まれます:
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
全てのプロパティは任意です(idとtypeも含む)。
id および type プロパティを使用したObjectの例です:
{
"@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"
}
アクティビティ語彙では、多くのソーシャルWebアプリケーションで共通して使用される
Object 型が定義されています。本仕様は、これらオブジェクトの意味論的に特定なプロパティまでは定義しません。Activity
Vocabularyでカバーされない詳細な情報は外部語彙を用いて表現できます。
また、実装はActivity Vocabularyで定義されていない新しい型のObjectを導入することができますが、他の実装で認識されない拡張型に過度に依存すると互換性の問題が発生する可能性があります。既存Object型との無用な重複やオーバーラップを避けるよう留意してください。
拡張型がコア語彙型と重複する場合、実装は必ずコア語彙型も指定しなければなりません。たとえば、いくつかの語彙(例:The Good
Relations Vocabulary)は独自の場所型を定義しています。たとえば
http://purl.org/goodrelations/v1#Location
型をオブジェクト型として使用したい場合、必ず
Place
も指定しなければならないことを、次の例で示します:
Place と gr:Location の両方であるObjectの例:
{
"@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定義のプロパティを優先して使う必要があります。
Activity Streamsの利用者は、Webブラウザやコンソールインタフェースでの表示など、Activity Streamsオブジェクトのテキスト表現を必要とする場合がよくあります。
name
プロパティは、作成者または他のユーザーによる入力から派生するべきです。
summary
プロパティは、フォールバックテキスト表現として使うべきであり、発行者によって自動生成される場合もあります。name
プロパティがない場合、summary プロパティにはマークアップを含めるべきではなく、テキスト表現として適切な短さであるべきです。
{
"@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."
}
{
"@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."
}
name と summary
はどちらも存在しないことがあり、エンドユーザーの現在の言語に明示的な値がない場合や、テキスト表現としては長すぎる場合もあります。これらの場合、利用側の実装ではフォールバック戦略を持つべきです。
Link は他リソースへの間接参照であり、その概念的なモデルは [RFC5988]
で確立されたリンクのモデルと密接に関連しています。Linkオブジェクトのプロパティは参照先リソースのプロパティではなく、表示エージェントがリソースを利用する方法を理解する上でのヒントとして提供されます。たとえば
height や width は参照された画像の実際のピクセル数ではなく、表示時の希望サイズを示す場合があります。
Linkの対象URIは必須のhrefプロパティで表します。加えて、全ての
Link インスタンスはアクティビティ語彙で規範的に定義される次の任意プロパティ群を共有します:
id |
name |
hreflang |
mediaType |
rel |
height |
width
例えば、全ての Object は
image
プロパティを持つことができ、その値はそのオブジェクトのグラフィカルな表現を示します。このプロパティは、画像(例: JPEG, GIF,
PNG)リソースへのURLを示し、ユーザーに表示されることが一般的です。同じオブジェクトに複数のビジュアル表現(複数のスクリーンショットや解像度違いなど)を持たせる場合もあります。Activity
Streams 2.0 では、これらの参照を記述する主な手段は3つあります。
{
"@context": "https://www.w3.org/ns/activitystreams",
"type": "Application",
"id": "http://example.org/application/123",
"name": "Exampletron 3000",
"image": "http://example.org/application/123.png"
}
{
"@context": "https://www.w3.org/ns/activitystreams",
"type": "Application",
"id": "http://example.org/application/123",
"name": "Exampletron 3000",
"image": {
"type": "Link",
"href": "http://example.org/application/123.png",
"mediaType": "image/png"
}
}
前者の例は画像リソースとの非修飾な直接関係を確立し、後者の例は追加プロパティを指定することができる修飾付きの間接関係を作ります。
{
"@context": "https://www.w3.org/ns/activitystreams",
"type": "Application",
"id": "http://example.org/application/123",
"name": "Exampletron 3000",
"image": [
"http://example.org/application/abc.gif",
{
"type": "Link",
"href": "http://example.org/application/123.png",
"mediaType": "image/png"
}
]
}
このような配列内の個々の項目は互いに独立しており、順序に意味はありません。
RFC 5988では、全てのリンクにはコンテキストを表現する「リンクリレーション」があるとしています。Link内では、
rel
プロパティでリンクリレーション値を与えます。relがなければ未指定扱いとなります。1つのLinkに複数のリレーション値を与えることもできます。JSONシリアライズでは単一の場合はJSON文字列、複数の場合は文字列の配列で指定します。
リンクリレーションのスコープは、そのLinkが直下にあるオブジェクトです。
次の例では2つの参照があり、1つ目はリレーション未指定、2つ目が "thumbnail" になっています。
{
"@context": "https://www.w3.org/ns/activitystreams",
"type": "Application",
"id": "http://example.org/application/123",
"name": "Exampletron 3000",
"image": [
"http://example.org/application/abc.gif",
{
"type": "Link",
"href": "http://example.org/application/123.png",
"mediaType": "image/png",
"rel": "thumbnail"
}
]
}
[HTML5]仕様は、[RFC5988]とはやや異なる"リンクリレーション"の定義を持っています。HTML5では、"スペース"U+0020、"タブ"(U+0009)、"LF"(U+000A)、"FF"(U+000C)、"CR"(U+000D)、","(U+002C)を含まない任意の文字列が有効です。相互運用性のため、Activity Streams 2.0の実装は、[RFC5988]と[HTML5]双方の構文的に有効なリンクリレーションのみを使用すべきです。未登録値の使用も可能です。
アクターオブジェクトは、アクティビティを実行できるエンティティを表す基本型Objectの特殊化です。アクティビティ語彙は、5種類のアクター型を規範的に定義しています:
Application
|
Group |
Organization
|
Person |
Service。
本仕様はアクターを非常に一般的な方法でのみ定義し、それぞれに意味的に特定なプロパティは定義しません。全てのアクターオブジェクトはObjectの特殊化であり、全Object共通のコアプロパティを継承します。アクティビティ語彙でカバーされない追加情報は外部の語彙で表現可能です。VCard [ vcard-rdf] は Person、 Group、Organization インスタンスへの追加メタデータ提供に推奨されます。
{
"@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
もそのアクターとして指定する必要があります(前述例参照)。
アクティビティオブジェクトは、すでに発生した、進行中、または将来発生する可能性のあるアクションに関する情報を提供する基本型Objectの特殊化です。
全Objectインスタンスが持つ共通プロパティに加え、Activityオブジェクトは
語彙で定義された次の追加プロパティをサポートします:
actor |
object |
target |
origin |
result |
instrument
typeプロパティは、そのアクティビティステートメントが表現するアクションの種類を識別するために使用されます。
{
"@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型を定義しています。本仕様はこれらアクティビティの意味的に特定なプロパティまでは定義しません。アクティビティ語彙でカバーされない詳細な情報は外部語彙で表現可能です。
実装はアクティビティ語彙で定義されていない新しいアクティビティ型を導入できますが、他実装で認識されない拡張型に頼りすぎると相互運用性の問題が生じます。既存アクティビティ型との重複や過剰なオーバーラップは避けるべきです。
拡張型がコア語彙型と重複する場合、実装は必ずコア語彙型も指定しなければなりません。例えば一部語彙(例:Schema.org)はアクション表現の独自型を定義しています。たとえばhttp://schema.org/LikeActionをアクティビティとして使いたい場合、必ず
Like
も指定しなければならないことは次の例の通りです。
Like と
http://schema.org/LikeAction の両方であるアクティビティ例:{
"@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"
}
実装はアクティビティオブジェクトを受動的にも命令的にも利用できます。受動的な意味では、アクティビティはすでに発生したまたは発生中の行動を記録するものです。命令的な意味では、アクティビティはアプリケーションに対して状態をアクション内容に沿って変更するよう指示するコマンドの役割も担えます。ただし、本仕様はフォーマットの利用方法を制約する規範的な処理モデルを定義しないため、アクティビティステートメントを通知とみなすか命令とみなすかは実装ごとに異なる場合があります。
自動詞アクティビティ(IntransitiveActivity)オブジェクトは、アクティビティ型の特殊化で、自動詞的なアクションを表現します。自動詞アクティビティオブジェクトは
object
プロパティを持ちません。
Collectionオブジェクトは、他の
ObjectまたはLink
のコンテナとして機能する基本型Objectの特殊化です。
全ての
Object
から継承する基本プロパティに加え、
Collection型は
追加で次のプロパティを持ちます:
items |
totalItems |
first |
last |
current
Collection
内の項目は順序付きでも順序なしでもかまいません。
OrderedCollection型は、中身が常に順序付けされるコレクションを識別するため利用できます。JSONシリアライズでは、順序なし項目はitemsプロパティ、順序あり項目はorderedItemsプロパティで表します。
{
"@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"
}
]
}
{
"@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"
}
]
}
コレクションは大量の項目を含むことができます。多くの場合、items(またはorderedItems)プロパティのみですべての項目をシリアライズするのは非現実的です。そのような場合、コレクション内の項目を明確なサブセットまたは「ページ」に分割できます。ページは
CollectionPage
型で識別されます。
型は基本の
CollectionPage
Collection型を拡張し、そのすべてのプロパティを継承します。さらに以下のプロパティを指定できます:
partOf |
next |
prev |
partOfプロパティは、そのCollectionPageが属する
Collectionを識別します。
first、next、prev、last、currentプロパティは、親コレクション内の項目の追加サブセットを含む他の
インスタンスを参照するために使われます。
CollectionPage
Collectionオブジェクトと同様に、CollectionPage内の項目も順序付きでも順序なしでもかまいません。OrderedCollectionPage型は項目が厳密に順序付けられるページとして利用できます。
型は
OrderedCollectionPage
および
CollectionPage
の両方を拡張します。それらから継承したプロパティに加え、OrderedCollection
OrderedCollectionPageはページに含まれる最初の項目の相対インデックス位置を示すstartIndexプロパティを持つことができます。
Collection、OrderedCollection、CollectionPage、OrderedCollectionPage間の関係図:
順序付きか否かに関わらず、コレクションのページは通常シーケンス(単方向または双方向リンクリスト)で並びます。firstプロパティはこの順序の最初のページ、lastは最後のページ、prevとnextはそれぞれ直前・直後のページを識別します。
currentプロパティは、Collection内で最近作成または更新された項目のサブセットを含むページを識別します。
first、last、next、prev、currentプロパティの値は、単一の
または
CollectionPage
Link(コレクションページを含む別リソース参照)となります。
{
"@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のインスタンスであるべきです。もしそうでない場合、利用側は項目の正しい順序を復元する手段を持ちません。
語彙で定義されているいくつかのプロパティは、「自然言語値」を持つものとして定義されています。これらは一つ以上の言語を用いる人間が読める文字列です。JSONシリアライズでは、(1)単一のJSON文字列、または(2)整形式な
[BCP47]
言語タグをキーとしてローカライズされた同値の翻訳文字列にマッピングしたJSONオブジェクト、いずれかで表現されます。シリアライズされたJSON内で、この2つの形式は単純なプロパティ名の付け方の規則により区別されます。たとえば
"name" は
name
プロパティのJSON文字列形式、"nameMap" はオブジェクト形式を表します。
{
"@context": "https://www.w3.org/ns/activitystreams",
"type": "Object",
"name": "This is the title"
}
{
"@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] 言語タグである必要があります。関連する値は必ず文字列でなければなりません。
アクティビティ語彙は、自然言語値を使用する3つのプロパティを定義しています:
name、
summary、
content。
それに対応し、JSONシリアライズでは "name"、"summary"、"content"
が文字列形式、"nameMap"、"summaryMap"、"contentMap" がオブジェクト形式を表します。
特別な言語タグ "und" は、その値の言語が不明または未決定であることを明示したい場合にオブジェクト形式で利用できます。
"und" 言語タグの使用:
{
"@context": "https://www.w3.org/ns/activitystreams",
"type": "Object",
"nameMap": {
"und": "This is the title"
}
}
[JSON-LD] の仕組みを使ってActivity Streams
2.0ドキュメントを生成または消費する場合、@context内で @language プロパティを使ってデフォルト言語を識別することができます。この仕組みは、JSON-LDとしてのActivity Streams
2.0ドキュメントの処理を選択しない実装では理解されない場合があります。
@context内でデフォルトの"@language"を指定:
{
"@context": [
"https://www.w3.org/ns/activitystreams",
{
"@language": "en"
}],
"type": "Object",
"name": "This is the title"
}
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>
|
左から右 | マークアップを無視した最初の強い方向性文字 |
既知の場合、Activity Streams 2.0 の発行者は 明示的に自然言語プロパティの言語をマークアップすべきです。マッププロパティ、またはデフォルト言語タグを使うことができます。
本仕様の例のすべてが自然言語プロパティの言語を明示的にマークしているわけではありません。これは意図的なものです。著者およびワーキンググループは、実装者が明示的な言語タグ付きの例をそのまま新しいドキュメントのテンプレートとしてコピー&ペーストし、不正確な言語マークアップになることを避けたいためです。
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 extensions についてのWikiを運営しています。
JSON-LD Processing Algorithms [ JSON-LD-API] は、@contextで定義されていない任意のプロパティを静かに無視することに注意が必要です。拡張プロパティを含むActivity Streams 2.0 ドキュメントを発行する実装は、すべての拡張に対して @context 定義を用意 すべきです 。
また、JSON-LD ドキュメント内で使用できない正当な JSON 構造体が存在することにも注意が必要です。たとえば、GeoJSON
仕様などで用いられる「配列の配列」は JSON-LD では禁じられています。このような構造は Activity Streams 2.0 ドキュメントの拡張として自由に使えますが、標準の JSON-LD
Processing Algorithms を利用する実装は、そうした拡張を無視するか、JSON-LD アルゴリズム適用前に互換可能な構造へマッピングしなければなりません。単純なGeoJSONのポイントは
Place
オブジェクトへ、より高度なジオメトリは GeoSparql の Well-Known
Text へ変換可能です(非規範的な例を下記に示します)。
{
"type": "Point",
"coordinates": [36.74, -119.77]
}
Place への変換例:
{
"@context": "https://www.w3.org/ns/activitystreams",
"name": "Fresno, California",
"type": "Place",
"latitude": 36.74,
"longitude": -119.77
}
{
"type": "Polygon",
"coordinates": [
[
[100.0, 0.0],
[101.0, 0.0],
[101.0, 1.0],
[100.0, 1.0],
[100.0, 0.0]
]
]
}
{
"@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))"
}
JSON-LD構文は「コンパクトURI」の利用をサポートしています。コンパクトURIとは、定義されたプレフィックスを利用しシリアライズを簡素化するためのURIの別形式です。例えば、URI
http://example.org/term は ex:を http://example.org/ に割り当てれば
ex:term と表せます。
JSON-LD内でのコンパクトURIプレフィックス定義は @context 定義内に記述されます。例:
{
"@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"
と明示的に定義されている場合に適用されます。具体的には、IRI(またはURI)値が期待される場所でコンパクトURIを使うことができます。
Activity Streams 2.0 の実装で拡張を完全にサポートしたい場合は、JSON-LD仕様で定めるコンパクトURI展開を必ずサポートしなければなりません。展開はすべてのプロパティ名および、JSON-LD @context で型 @id
と定義されたすべてのプロパティ値に適用されます。
コンパクトURI形式への過度の依存は不明確さや実装間の相互運用性問題につながる恐れがあります。そのため、コンパクトURIはプロパティ名やtypeプロパティ値「以外」では極力避けるべきです。
JSON-LDを利用して拡張プロパティを含むActivity Streams 2.0ドキュメントをパース・再シリアライズする場合、実装は拡張プロパティが元のドキュメント内で保存・適切にシリアライズされるよう十分に注意すべきです。
例えば次のように、仮の foo および bar 拡張プロパティを含むActivity
Streamオブジェクトを考えます。foo拡張はJSON-LD @context で定義され、bar はされていません。
{
"@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としてパースし再シリアライズする場合(例えば保存や再配布)、@context、foo、bar
の各プロパティ値をそのまま保持すればOKです。
ただしJSON-LD拡張アルゴリズムを利用した場合、@context は展開結果から消え、bar プロパティは「ブランクノード」
_:bar にマッピングされます。その後、規範的なActivity Streams 2.0
contextで再シリアライズすると、JSON-LDのコンパクト化結果は以下のようになります:
{
"@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コンパクト化の際に再利用 すべきです。
Activity Streams 2.0 ドキュメントには、身元や連絡先情報、現在地、身体的特徴など、潜在的に機微な個人情報が含まれる(そして実際に含まれる可能性が高い)場合があります。さらに、アクティビティデータ自体も、個人やアクターの集団の行動プロファイルを生成するために分析され得ます。
Activity Streams 2.0 ドキュメントを生成・消費する実装は、(a) 実装によって公開・消費・収集される可能性のある機微な個人情報の種類、(b) その情報の公開・消費・収集理由、(c) その情報の利用方法、(d) その情報が共有される第三者の身元、(e) 他者と共有する理由について、すべての潜在的なユーザーに対しオープンかつ公開の形で記録し伝達しなければなりません。
Activity Streams 2.0 ドキュメントを公開する実装は、ユーザーが追加情報の共有に「オプトイン」していない限り、文書に含まれる機微な個人情報の種類および量を制限することを標準とすべきです。
Activity Streams 2.0 ドキュメントを消費する実装は、ユーザーがその情報の保存や共有に「オプトイン」していない限り、取り込んだドキュメントに含まれる機微な個人情報をデフォルトで保存したり共有すべきではありません。
ここで「オプトイン」には、必ずしもユーザーによる明示的な操作が必要とは限りません。たとえば、特定の機微な個人情報の利用が実装の利用形態上明確に暗黙である場合(例:位置情報追跡サービスなど)、上記ドキュメント指針が守られているかぎり、その実装を利用すること自体が当該情報の利用と共有への黙示的な同意とみなされます。
Activity Streams を公共データストリームとして実装する発行者や消費者は、無関係な商業コンテンツや悪意のあるコンテンツが混入する可能性についても考慮し、そのようなコンテンツを識別・対処または実装に含めないよう未然に対策すべきです。
発行者は、クロスサイトスクリプティングなどの悪意あるユーザー入力が Activity Streams データに含まれないよう、合理的な対策を取るべきです。
取り込んだ内容をエンドユーザーに再出力する消費者は、取り込んだ悪意ある入力が再出力されないよう、合理的な対策を必ず講じてください。
取り込んだコンテンツを検索エンジン用クロールに再出力する消費者は、自サイトが検索エンジン最適化抜け道にならないよう、合理的な対策をとるべきです(例:不審なハイパーリンクをテキスト化・rel="nofollow" 属性を付与する等)。
攻撃者がプロパティ値を詐称したアクティビティやオブジェクトを公開し、悪意ある内容の注入や正当内容の隠蔽・改ざん・ユーザー誤誘導を狙う「なりすまし攻撃」にも注意してください。
Activity Streams はJSONドキュメントであり、[RFC7159] で述べられているセキュリティ考慮事項も対象となります。
Activity Streams 実装は URI を扱います。詳細は [RFC3986] のセクション7を参照。
Activity Streams 実装は IRI も扱います。詳細は [RFC3987] のセクション8を参照。
application/activity+json メディアタイプ
本仕様は
application/activity+json
MIMEメディアタイプを、Activity Streams 2.0 形式に準拠した文書識別専用として登録します。
| 型名: | application |
| サブタイプ名: | activity+json |
| 必須パラメータ: | なし |
| 任意パラメータ: |
profile: application/activity+json メディアタイプの profile
パラメータにより、1つ以上のプロファイルURIを指定できます。これらのURIの識別子の意味は [RFC6906] で定義されています。"profile"メディアタイプパラメータは必ず引用符で囲む必要があります。空でないスペース区切りURIリスト(プロファイルURI群)を含みます。
profile-param = "profile=" profile-value
profile-value = <"> profile-URI 0*( 1*SP profile-URI ) <">
profile-URI = URI 上記の "URI" は [RFC3986]
第3節で定義される"URI"です。
|
| エンコーディング考慮事項: |
"application/activity+json" メディアタイプを使うリソースは "application/json"
メディアタイプのすべての要件に準拠することが求められ、よって [RFC7159] 第11節で規定されるエンコーディング考慮事項にも従う必要があります。
|
| セキュリティ考慮事項: | 本仕様で定義される通り。 |
| 連絡先: | 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 と同等とみなすべきです。
本仕様中のすべての図・例・注記及び「非規範的」と明示されているすべてのセクションは非規範的です。それ以外の本仕様中のすべてが規範的です。
適合文書とは、すべてのドキュメント向け適合条件に準拠する文書です。可読性のため、これら適合要件の一部は発行者への要件として記述されていますが、そのような要件は暗黙的に文書への要件となります。すべての文書には定義上必ず発行者が存在するとみなします。
適合文書は Activity Streams 1.0 の非推奨・廃止構文を一切含んではなりません。適合文書はアクティビティ語彙のプロパティや型を必ず含まなければなりません。他の語彙を使う適合文書もセクションCのように同等のアクティビティ語彙プロパティおよび型を含めなければなりません。適合文書はJSON-LDや本仕様で禁止された他のシリアライズ機能を使ってはなりません(セクション2参照)。アクティビティ語彙で定義されたもの以外の型やプロパティを含む適合文書は、セクション5で定義される拡張機能を使わなければなりません。
文書例(網羅的ではありません):
適合実装は、適合文書を発行・保存・分析・消費・それ以外の方法で処理するソフトウェアです。主な実装の種類は発行者と消費者です。
適合発行者は、適合文書を生成および公開する実装です。適合発行者はセクション2のシリアライズ要件に従って適合文書を提供しなければなりません。適合発行者はセクション6で述べるプライバシーを考慮しなければなりません。適合発行者はセクション7で述べるセキュリティを考慮しなければなりません。
発行者例(網羅的ではありません):
適合消費者は、適合文書を読み取り・解析する実装です。Activity Streams 1.0 の非推奨または廃止プロパティや型も許容しなければなりません。アプリケーションドメインに無関係なプロパティや型は無視すべきです。
適合消費者は、適合文書を他のデータ形式に再公開することができます。適合消費者は、適合文書を画面上・印刷・音声・その他の方法でユーザーに提示できます。適合消費者は、適合文書に表現された情報を他形式・他メディアに忠実に変換しなければなりません。適合消費者が適合文書を再公開する場合は、セクション6のプライバシー、セクション7のセキュリティを考慮すべきです。
消費者例(網羅的ではありません):
Activity Streams 2.0仕様は W3C ソーシャルウェブワーキンググループの成果です。編集者は議論、課題、テストなどを通じて本仕様の形成に貢献してくださったワーキンググループの全メンバーに感謝します。
また、仕様が 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, and Zach Shepherd.
このセクションは規範的ではありません。
注意: この付録セクションは規範的ではありませんが、MUST など規範用語を使っています。ここで使用する場合は、実装者がこの付録で説明するActivity Streams 1.0の後方互換モデルを適切に実装するために必要とされる要件を意味するものとします。
本仕様で定義される構文は、JSON Activity Streams 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.0構文の出力は避けるべきです。
特に以下の点に留意してください:
application/stream+json"
MIMEメディアタイプを、2.0構文準拠シリアル化の場合は"application/activity+json" を使うことができます。
application/stream+json" またはより一般的な "application/json"
MIMEメディアタイプで識別されるシリアライズを処理する実装は、[AS1]
に従った構文および処理規則に必ず従う必要があります。2.0構文および処理規則は、"application/activity+json"メディアタイプの際のみに適用されます。
idはJSON-LD
@idのエイリアス、objectTypeとverbプロパティはJSON-LD
@typeのエイリアスとして扱うべきです。
displayName プロパティが使われていますが、2.0では name へ改名されています。実装では
displayName を name のエイリアスとして扱うべきです。
title プロパティは 2.0 では廃止されました。1.0ドキュメントを 2.0
として処理する場合、title プロパティ出現は拡張として扱うべきです。
content や
summary
プロパティを自然言語値として再定義しています。これにより値は文字列または言語タグから文字列へのマップいずれでも表現できます。1.0構文では値はString値でのみ記述されますが、1.0値はこの仕様でも許容される有効なサブセットなので、継続サポートのため特段の対応は不要です。
upstreamDuplicates および downstreamDuplicates
プロパティを廃止し、代替は提供しません。これは現実的な実装事例がほぼ見られないためです。両プロパティは継続利用してもよいですが、実装はなるべく避けるべきです。
post" 動詞は、オブジェクトの作成および「投稿」やアップロード両方のアクションを表現していました。本仕様では
"post" 動詞を
Create および
Add
アクティビティ型に分離しました。1.0ドキュメントから2.0へ変換する場合、targetプロパティがなければCreateと、targetプロパティがあればAddと同等として扱うべきです。
上記ガイドラインに従うことで、すべてのJSON Activity Streams 1.0シリアライズは2.0実装でも問題なく処理できます。
このセクションは規範的ではありません。
データ出典や注釈のようなアクティビティの特性に応じて複数の語彙を利用して、Activity Vocabularyを補完することができます。例えばEricが短いノートを書いてフォロワーと共有します。投稿後にスペルミスに気付き、ノートを編集し再投稿します。後に、そのノートの内容が誤りだったと判断し、削除します。
{
"@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"
}
]
}
このセクションは規範的ではありません。
この文書は前回の候補勧告 2016-12-15 から以下の主な変更があります。
CollectionPage
プロパティを明確化。
@vocab キーワードと拡張用プレフィックスを使ったオブジェクト形式の context 指定例
'http://www.test.example/martin' が 'http://example.org/foo.jpg' を作成を表す。追加情報はなし
id および type でグローバル識別子とオブジェクト型を示す Object 例
Place かつ gr:Location
であるオブジェクトの例Like かつ http://schema.org/LikeAction のアクティビティ例
Collection、OrderedCollection、CollectionPage、OrderedCollectionPageの関係図
"und" 言語タグ利用例@context 内のデフォルト "@language" 指定例
Place への変換例