こんにちは。 Javaエンジニアの中本です。
現在、Web API のスタンダードなフォーマットといえば JSON ですね。 今回はそのJSONの仕様の1つであるECMA-404を眺めてみようと思います。
Standard ECMA-404 - Ecma International リンク先の仕様書のPDFがあるのですが、全体でも14ページ、メインのJSONについては5ページとなっており、(物理的に)とても軽量な仕様です。
なお、他にRFC7159という仕様が策定されています。 RFC 準拠的な JSON 形式について
JSONとしての構文は同じですが、MIMEタイプや実行可能なコードが含まれているかもしれないのでeval()
してはいけないなどのセキュリティについての考慮事項など、インターネットで利用するための要件についても言及されています。
こちらのほうが発行は新しいです(RFC7159は2014/03で、ECMA-404は2013/10)
Web API フォーマットとしてJSONを利用する際は、こちらも参照してください。
今回はJSON の構文に関心があるので、図解されているECMA-404を取り上げました。
JSON Text
JSON text とは、JSON の文法に準拠したトークンの並びを 指します。 下記の要素をトークンと定めています。
- structural tokens
{
、}
、[
、]
、:
、,
- literal name tokens
true
、false
、null
- numbers(JSON数値)
- 後ほど
- strings(JSON文字列)
- 後ほど
見慣れた文字が並んでいますね。
また、"空白文字"は任意のトークンの前後に挿入することができますが、JSON文字列内でのスペースを除いて、トークン内に含めることは認められていないです。
ですので、"tr ue"
とか "12 3 4 56"
はOKだけど、tr ue
とか12 3 4 56
とか
"abc def"
などと書いてはダメってことですね。 なお、"空白文字"は下記の4つと定められています。
- 水平タブ
- ラインフィード
- キャリッジリターン
- スペース
JSON Values
JSONオブジェクト、JSON配列、JSON数値、JSON文字列、true
、false
、null
を JSON value (JSON値)と呼んでいます。
JSONオブジェクトの定義などは、この後記載されています。
また、仕様書には構造を表したきれいな図が記載されていますので、そちらもご覧ください。
Objects
さて、仕様書も折り返し地点です。
object(JSONオブジェクト) は 0個以上の名前/値のペアを持つ{
と}
で囲まれたものとして定義されています。
名前の部分はJSON文字列で、値の部分はJSON値です。
加えて、名前と値は1つのコロンで分けられるとか、1つのコンマで値とそれに続く名前とを区別すると書いてあります。
{"one": 1, "two": 2}
といった、いわゆる JavaScript のオブジェクトリテラルみたいなものです。
Arrays
JSON配列は 0個以上のJSON値を持つ[
と]
で囲まれたものとして定義されています。
値は,
で分けられます。また、値の順序は保持されます。
["The", {"order": "of"}, "the", "values", "is", "significant.", null]
Numbers
JSON数値の箇所の図はけっこう複雑に見えます。が、普段使っている数値を表現したものになっています。
- 負の符号をつけることができる
-100
- 整数、小数が表現できる
0.12345
- 指数表現もできる
6.02E+23
- 数値の前に余分な0を置かない
- 数値の並びで表現できない数値表現は不可
こんな感じです。なので、+100
とか001
、NaN
などは不正なJSON数値ということになります。
String
JSON文字列も仕様書の図を見てもらうとわかりやすいのですが、
"
と\
と制御文字を除いたすべてのUnicode文字- エスケープで表現される文字(
\"
、\\
、\/
、\b
、\f
、\n
、\r
、\t
) - Unicode エスケープシーケンス
を引用符"
で囲んだものとなっています。
なので、下記のような文字列もJSON文字列であるといえます。
"\u004Do\u006E\u0065\u0079\t\u0046\u006F\u0072\u0077\u0061w\u0064\u0021\uD83D\uDC4D"
仕様は以上です
コンパクトですね。 簡潔でわかりやすいので、広く普及したのもうなずけます。 また、JSONパーサーの実装に挑戦してみるのも面白そうです。 業務では各言語の標準ライブラリやOSSライブラリを利用するかと思いますが、それらの高速化の工夫や安全な入出力にする対応、使いやすくするためのAPIデザインなどがどうなっているのかなどを自分の実装と比較してみると新しい発見があると思います。
最後に
マネーフォワードでは、JSON Web API を自由自在に扱えるエンジニアを募集しています。 ご応募お待ちしています。
【採用サイト】 ■マネーフォワード採用サイト ■Wantedly | マネーフォワード
【プロダクト一覧】 ■家計簿アプリ・クラウド家計簿ソフト『マネーフォワード』 ■家計簿アプリ・クラウド家計簿ソフト『マネーフォワード』 iPhone,iPad ■家計簿アプリ・クラウド家計簿ソフト『マネーフォワード』 Android ■クラウド型会計ソフト『MFクラウド会計』 ■クラウド型請求書管理ソフト『MFクラウド請求書』 ■クラウド型給与計算ソフト『MFクラウド給与』 ■経費精算システム『MFクラウド経費』 ■消込ソフト・システム『MFクラウド消込』 ■マイナンバー対応『MFクラウドマイナンバー』 ■創業支援トータルサービス『MFクラウド創業支援サービス』 ■お金に関する正しい知識やお得な情報を発信するウェブメディア『マネトク!』