アピアリーズ Tech Blog

アプリ開発・運用を簡単にするBaaS「アピアリーズ」。このBlogでは、アプリを作りたい方、運用したい方、広めたい方に、ちょっぴり使える情報をお届けします。

JSONをマスターしよう!

JSONとは?

JSONとはJavaScript Object Notationの略で、テキストベースのデータフォーマット形式です。
アピアリーズのDBでは、このJSON形式でデータを保存しますので、ぜひ抑えておいて下さい。 JSONはインターネットに関する技術標準を定めるIETFにより「RFC4627」として規定されています。

文字通りJavaScriptにおけるオブジェクト表記法のサブセットではありますが、これは決してJavaScriptに限定されるものではなく、JAVA、Objective-C、Ruby、PHP、C#など、あらゆる開発言語で利用することが可能です。
構造化されたデータを簡潔に記述することができるため、容易で理解しやすいデータフォーマットと言えます。

例えば、
「東京都の山田太郎さん25歳、未婚・子供なし。兄弟は次郎と三郎」
というオブジェクトをJSONで表記すると以下のようになります。

{
  "name": "Taro Yamada",
  "address": "Tokyo",
  "age": 25,
  "married": false,
  "child": null,
    "brothers": [
    "Jiro",
    "Saburo"
  ]
}

オブジェクトは始まりと終わりの中括弧{}で囲んで表現します。
また、名前(キー)と値でペアになった複数の要素が、カンマで区切られて表現されています。

構造化型文字列一覧
オブジェクトの始まり左中括弧 {
オブジェクトの終わり右中括弧 }
名前と値の区切り文字コロン :
各要素の区切り文字カンマ ,
配列の始まり左角括弧 [
配列の終わり右角括弧 ]

名前(キー)、値(バリュー)とそれぞれの要素

名前(キー)は、必ず文字列で表現する必要があります。また1つのオブジェクト内では、名前は一意にする必要があります。
一方、値(バリュー)については、数値、文字列、定義済み文字列(true/false/null)、配列、オブジェクトで表現します。

{
  "name": "Taro Yamada"
}

この例では、"name”が名前(キー)、"Taro Yamada"が値(バリュー)となります。

数値

{
  "age": 25
}

数値は10進法表記のみ可能。8進、16進法表記などはできません。
浮動小数点数としては1.0e-10といった指数表記が可能です。
※数値は囲いなし。ダブルクォーテーションで囲うと文字列の扱いになります。

文字列

文字列はダブルクォーテーション""で囲う必要があります。
Unicode文字列でエンコードします。(デフォルトエンコードはUTF-8)
ダブルクオーテーションやバックスラッシュ、その他の制御文字の表現にはエスケープ文字を用います。

エスケープ文字一覧
エスケープ表記元の文字文字名称(説明)
\""ダブルクォーテーション
\\\バックスラッシュ
\//スラッシュ
\b バックスペース
\f 改ページ
\n キャリッジリターン(CR・改行)
\r ラインフィード(LF)
\t タブ
\uXXXX(任意の文字)4桁の16進数で表記されたUnicode文字

定義済み文字列

true / false と null が定義されています。いずれも全て小文字で表記する必要があります。

{
  "married": false,
  "child": null
}

配列

配列はゼロ個以上の値をカンマ,で区切って、角括弧[]でくくることで表現します。

{
    "brothers": [
    "Jiro",
    "Saburo"
  ]
}

オブジェクト

{}で囲ったオブジェクトを入れ込むことができます。

{
  "child": {
    "name": "Taro Yamada",
    "address": "Tokyo"
  }
}

JSONの表記(まとめ)

父「埼玉県の山田一さん55歳、既婚・子供は山田太郎さん。兄弟なし」
子「東京都の山田太郎さん25歳、未婚・子供なし。兄弟は次郎と三郎」
この親子関係をJSONで表現すると、以下のようになります。

{
  "name": "Hajime Yamada",
  "address": "Tokyo",
  "age": 55,
  "married": true,
  "child": {
    "name": "Taro Yamada",
    "address": "Tokyo",
    "age": 25,
    "married": false,
    "childname": null,
    "brothers": [
      "Jiro",
      "Saburo"
    ]
  },
  "brothers": null
}

また、JSONの表記においては、半角スペース、タブ、改行(LF)、キャリッジリターン(CR)が構造化型文字列の前後にあっても差し支えないこととなっています。
※逆に言えば、インデント調整に上記以外の文字は利用できません。全角スペースの混入などには十分お気をつけ下さい。
したがって、下記の3つは全て同じオブジェクトと見なされます。

{"name":"Taro Yamada","address":"Tokyo","age": 25}


{
   "name"     :  "Taro Yamada",
   "address"  :  "Tokyo","age" : 25
}


{
  "name": "Taro Yamada",
  "address": "Tokyo",
  "age": 25
}

日時の扱いについて

JSONの値(バリュー)は、数値、文字列、定義済み文字列、配列、オブジェクトで表現します。したがって、日付や時刻を表現する場合は、数値、または文字列を利用することになります。

計算が不要な場合は、"2014年1月1日"や"2014/1/1 12:00:00"といったように文字列で表現する方法もありますが、日付、時刻を扱う大抵のアプリでは計算をする必要が出てくるかと思います。これらの解決には、UNIX時間(エポック秒)を利用します。

UNIX時間とは、1970年1月1日午前0時(協定世界時・UTC)の値を0として、そこからの経過秒数で日時を表現します。例えば、2014年7月1日 10時30分00秒(UTC)は、1404178200となります。
(実際は閏秒が挿入されることがあるため、僅かではありますが、現実の経過時間との間でのギャップは存在します)

おわりに

いかがでしたでしょうか? 一度ですべてを覚えるのは大変だと思いますので、サンプルのJSONデータを利用してみたり、再構成してみたりと、繰り返して慣れるのがマスターの近道です。 アピアリーズのBaaSに限らず、アプリ開発上、様々なところで利用するものですので、ぜひ習得しておくことをおすすめします。