JSON-LDへの愚痴
次のような未知のJSONがソフトウェアに与えられたとき、
{
"name": "Alice"
}ソフトウェアは
"Alice"という値がなんであるかを識別することはできません。よって、nameという文字列キーの代わりに事前に定義された識別子を用いることにしましょう。例えば:{
"http://xmlns.com/foaf/0.1/name": "Alice"
}(URLとして解釈可能な文字列ではありますが、これはたまたまです。URLとして機能するわけではありません。便宜上このような文字列を使っているというだけ。
ここで、互換性のため
@contextというものを考えたいと思います。これを使って次のように書くと、{
"@context": {
"name": "http://xmlns.com/foaf/0.1/name"
},
"name": "Alice"
}@contextを無視するだけで、従来のソフトウェアは今まで通りにJSONを扱うことができます。これがJSON-LDの基本的なコンセプトです。ちなみに
@contextではあらゆる識別子をあらゆる文字列へマッピングできます。よって、ソフトウェアは次の2種類のJSON-LDを同じように解釈する必要がありますね!{
"@context": {
"name": "http://xmlns.com/foaf/0.1/name"
},
"name": "Alice"
}{
"@context": {
"名前": "http://xmlns.com/foaf/0.1/name"
},
"名前": "Alice"
}ではここでさらなる抽象化を考えてみましょう。次のようにすると、与えられたJSON-LDが人物の情報であることを表すことができます。
{
"@context": "https://json-ld.org/contexts/person.jsonld",
"name": "Alice"
}コンテキストは複数指定することもできますし、従来の辞書型と混ぜることもできます。さらに、あるコンテキストで定義されたキーに別名を付けて使うこともできます。
{
"@context": [
"https://example.com/foo",
"https://example.com/bar",
{
"buz": "https://example.com/buz",
"qux": "buz:qux"
}
]
}そうそう、クラス定義というものもあります。次の例における
"Object"という文字列値は、Activity Vocabulary(ActiviyPubを構成する仕様の一つ)におけるObjectというクラスであることを示すものです。{
"@context": "https://www.w3.org/ns/activitystreams",
"type": "Object",
"id": "http://www.test.example/object/1",
"name": "A Simple, non-specific object"
}Objectという文字列がキーとして使われることがないことはJSON-LDからは読み取れませんが、まあなんとかしてください!ちなみにMisskeyが送信するJSONに付与する
@contextは次の通り。つまり、このコンテキストを理解できるソフトウェアを作れば、Misskeyと連携することができるということです。{
"@context": [
"https://www.w3.org/ns/activitystreams",
"https://w3id.org/security/v1",
{
"Key": "sec:Key",
"manuallyApprovesFollowers": "as:manuallyApprovesFollowers",
"sensitive": "as:sensitive",
"Hashtag": "as:Hashtag",
"quoteUrl": "as:quoteUrl",
"toot": "http://joinmastodon.org/ns#",
"Emoji": "toot:Emoji",
"featured": "toot:featured",
"discoverable": "toot:discoverable",
"schema": "http://schema.org#",
"PropertyValue": "schema:PropertyValue",
"value": "schema:value",
"misskey": "https://misskey-hub.net/ns#",
"_misskey_content": "misskey:_misskey_content",
"_misskey_quote": "misskey:_misskey_quote",
"_misskey_reaction": "misskey:_misskey_reaction",
"_misskey_votes": "misskey:_misskey_votes",
"_misskey_summary": "misskey:_misskey_summary",
"isCat": "misskey:isCat",
"vcard": "http://www.w3.org/2006/vcard/ns#"
}
]
}(ですがMisskeyは受信したJSON-LDをただのJSONとして解釈し、
@contextの内容は関知しません。)そもそも情報交換用のサーバ間APIでJSON-LDのような柔軟で既存のJSON構造を壊さずに導入できる仕様を使う必要はないかもしれませんが……まあ細かいことは気にしない!
それでは、楽しいActivityPubサーバ開発を!!!












![묶여있던 슬랙 알림 6건을 펼친 화면
“[GeekNews] at://의 위치는 어디인가” 항목에 하이라이트 되어있다.](https://media.hackers.pub/note-media/687ff4c4-af55-4ec2-b31c-0e5a314f6bfd.webp)



















![FEConf 2025 유튜브 동영상 페이지 화면.
상단에는 파란색 행사 배경 위로 왼쪽에 김무훈 연사의 마이크를 든 발표 사진과 ‘FEConf’ 로고가 보이고, 오른쪽에는 발표 슬라이드가 보인다.
슬라이드 제목은 “모두를 위한 웹 접근성, 무엇이고, 어떻게 하나요? 💬🔉”, 발표자는 김무훈, A11YKR 커뮤니티, 링크와 QR코드가 포함되어 있다.
하단에는 유튜브 동영상 정보가 표시되며, 영상 제목은 “FEConf 2025 [B3] ‘중요하지만 긴급하지 않은 일, 그럼에도 계획해야 하는 웹 접근성’”, 조회수 28회, 9시간 전 게시됨, 채널명은 FEConf Korea.](https://media.hackers.pub/note-media/1fbd505a-64dc-43d7-94c3-359099d4b47a.webp)
