234
229

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

JSON-LD

Last updated at Posted at 2014-04-29

本当は、"JSON-LDとXML"というタイトルにしようと思ったが、XMLは語るにはあまりに広い世界で恐ろしいし、詳しい先生方が多い領域なので、JSON-LD だけを書くことにした、そんなエントリーです。
(もっとも、Linked Data 初心者であることは確かですので、誤りが有れば、ご指摘下さい)

追記 2014/08/27:
メトロのオープンデータ活用コンテストが、JSON-LDなのに気をよくして、配列について追記しました。

みんな大好きJSON ですが、JSONでは、複雑なデータを記述できません。端的に言うと、XMLのように、XML Namespaceを使って、スキーマを使った意味づけができません。これでは、意味づけが曖昧になって、利用に制限が生じるので、何とかしよう、というのが JSON-LD です。

W3C の仕様
http://www.w3.org/TR/json-ld/

W3C の仕様のサンプルがすばらしいので、こちらをベースに紹介します
(以下のサンプルは、W3Cのサイトからの転載です。)

初めに、神はJSONを創造された。

{
  "name": "Manu Sporny",
  "homepage": "http://manu.sporny.org/",
  "image": "http://manu.sporny.org/images/manu.png"
}

普通ですね。でも、それぞれの項目の意味は、感覚的です。人間には分かりますが、機械は、その意味を、曖昧さを排除して理解することはできません。 (つまり、Machine readable ではありません。)
また、全ての項目が文字列になっていますが、URL なのか、文字列なのかは、明確に区別されるべきです。

神は言われた。「Linked Data たれ。」こうして、JSON-LDがあった。

{
  "http://schema.org/name": "Manu Sporny",
  "http://schema.org/url": { "@id": "http://manu.sporny.org/" }, // <=@id は、IRI(URL)だから必要
  "http://schema.org/image": { "@id": "http://manu.sporny.org/images/manu.png" }
}

この例では、全ての項目を schema.org を使って定義しました。
urlimageで、@idを使っているのは、この値がIRI(Internationalized Resource Identifier。IRIは、URLを拡張したもので、リソースを一意に示す識別子。) であるためです。

Context

そろそろ旧約聖書ネタは止めますが、上の例だと、機械には分かりやすいですが、人間には書きにくい/分かりにくいですよね。
そこで、JSON-LD では、Context というものを定義できます。

Context は、JSON-LD のデータ自身に埋め込むこともできますし、別に書くこともできます。

別に描く場合、まず、以下のようなファイルを書きます。

person.jsonld
{
  "@context":
  {
    "name": "http://schema.org/name", // <= 'name' は、'http://schema.org/name' の略として定義
    "image": {
      "@id": "http://schema.org/image", // 'image' は 'http://schema.org/image' の略として定義
      "@type": "@id" //型はIRIであるとして定義
    },
    "homepage": {
      "@id": "http://schema.org/url",
      "@type": "@id"
    }
  }
}

そして、これをどこかに置きます。例えば、 http://json-ld.org/contexts/person.jsonld

そうすると、以下のように書けます。

{
  "@context": "http://json-ld.org/contexts/person.jsonld",
  "name": "Manu Sporny",
  "homepage": "http://manu.sporny.org/",
  "image": "http://manu.sporny.org/images/manu.png"
}

同じく、以下のように、インラインにも書けます。

{
  "@context":
  {
    "name": "http://schema.org/name",
    "image": {
      "@id": "http://schema.org/image",
      "@type": "@id"
    },
    "homepage": {
      "@id": "http://schema.org/url",
      "@type": "@id"
    }
  },
  "name": "Manu Sporny",
  "homepage": "http://manu.sporny.org/",
  "image": "http://manu.sporny.org/images/manu.png"
}

配列はどうやって書くのか?

普通に以下のように書けます。(children以下が配列です)

{
  "@context": {
    "name": "http://example.com/vocab#name",
    "children": "http://example.com/vocab#children"
  },
  "@id": "#homer",
  "name": "Homer",
  "children": [
    {
      "@id": "#bart",
      "name": "Bart"
    },
    {
      "@id": "#lisa",
      "name": "Lisa"
    }
  ]
}

無名の項目が必要な場合、Reserved Property を使えます。利点はよく分かっていないのですが、親となる項目が無い場合には、この方が良いかもしれません。

{
  "@context": {
    "name": "http://example.com/vocab#name",
    "children": "http://example.com/vocab#children"
  },
  "@graph": [
    {
      "@id": "#bart",
      "name": "Bart"
    },
    {
      "@id": "#lisa",
      "name": "Lisa"
    }
  ]
}

まとめ?

いかがでしょうか。JSON-LD の利用例は、まだほとんどありませんが、今後、国際標準化で活発に使われることが予想されます。そのため、しばらくすると、W3Cの仕様書などで、目にすることも増えると思われます。

234
229
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
234
229

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?