Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
223
Help us understand the problem. What is going on with this article?
@ikeyasu

JSON-LD

More than 5 years have passed since last update.

本当は、"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の仕様書などで、目にすることも増えると思われます。

223
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ikeyasu
(株)ACCESS Co-CTO。 主にIoTとクラウドとAIとドローン屋やってます。
access
SDNからセンサ、家電、電子書籍まで。ACCESSはあらゆるレイヤのデバイス、サービスを「繋げて」いきます。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
223
Help us understand the problem. What is going on with this article?