JSON

読み:じぇいそん
外語:JSON: JavaScript Object Notation 英語
品詞:名詞

データ交換フォーマットの一つ。

目次

JavaScript(ECMAScript)でのオブジェクトの表記法を、そのまま用いたデータフォーマット。

MIMEタイプ名はapplication/jsonが使われている。

JavaScriptのオブジェクト表記法を元に、2001(平成13)年頃にDouglas Crockfordが「発見」し、JSONと命名した。なおDouglas Crockfordによると、JSONは以前から存在しており、自分は発見をしただけだと主張している。

JavaScriptで使いやすかったことから広く普及し、やがてJavaScriptだけでなくPythonPHPJavaC++などWebアプリケーションを作成するためのフロントエンドやバックエンドで使われる様々なプログラミング言語で対応されるようになった。

由来

データ交換フォーマットとしては、かつてはXMLを普及させようという動きもあった。

古くはHTMLもXMLで書くXHTMLが作られたほどXMLは一時覇権を取るデータ交換フォーマットではあったが、しかしXMLは記述も解析も困難だった。手書きはともかく機械処理しにくいフォーマットは使いにくい。

対してJSONは、軽量で、JavaScriptによる記述や解析が容易であったため一気に普及、XMLよりも普及した。そこで2006(平成18)年7月にRFC 4627としてInformational(情報提供)扱いで公開された。また、元となったJavaScriptはECMA InternationalでECMAScriptとして標準化されていたが、さらにJSONもECMA-404として標準化され、XMLを置き換えてデータ交換フォーマットとして一般化することになった。

亜種とアプリケーション

フォーマット

  • 1レコードごとに改行するもの
    • jsonl (JSON Lines)
    • ndjson (Newline delimited JSON) ‐ MIMEタイプ名はapplication/x-ndjson
    • JSON-LD ‐ W3Cが標準化したもの
  • 人間が読み書きする向きのもの
    • JSON5 ‐ 拡張子json5、MIMEタイプはapplication/json5
  • その他
    • JSONP (JSON with padding) ‐ コールバック用の関数を埋め込んだJSON
    • jsonc (JSON with Comments) ‐ Microsoft Visual Codeでの実装

アプリケーション

  • GeoJSON ‐ 空間情報を記録するためのもの。MIMEタイプはapplication/geo+json
  • TopoJSON ‐ GeoJSONの拡張で、トポロジーを記述するためのもの

原則

値については、""で括ると文字列とみなし、数値、およびtrue/falseのBoolean値、そしてヌル値(null)は""で括らない。

符号化はUTF-8を用いるが、BOM(バイトオーダーマーク)を先頭に付けてはならない。日本では俗にUTF-8Nとも呼ばれる形式となる。

データは一つずつ{}で囲まれるが、改行は不要で、そのまま延々と連続してよい。ただこれだと人力での処理が面倒なため、一つずつ改行を入れる形式も提案されている。

書式

情報は「キー」と「値」からなるデータ列とする。

"キー" : 値

キーは文字列なので原則として""で括るが、JSONの亜種によっては不要とするものもある。値は、文字列は必ず""で括り、文字列でない場合は""で括らない。

このJSONオブジェクトはJavaScriptのサブセットであるため、JavaScriptでeval()関数で評価することでJavaScriptオブジェクトに変換することが可能という特徴がある。

Ajaxで使われるXMLよりもデータ量がコンパクトで、かつWebブラウザーで使われるJavaScriptとの親和性が高いことから普及している。

ごく簡単には、次のような書式となる(項目が二つある場合)。

{

"name1" : "value1",

"name2" : "value2"

}

情報量が少ない場合は改行せずに1行でまとめることも可能。この他に、[ ] を使って構造化することもできる。

使用例

実際には、複数あるデータが配列の形で渡される使用例が多い。

{"product":[

{"code":100,

"name":"しょうゆラーメン",

"price":300},

{"code":200,

"name":"塩ラーメン",

"price":310},

{"code":300,

"name":"味噌ラーメン",

"price":320}

]

}

取得されたデータをeval()で評価し、各プロパティを参照することになる。

配列として定義されているため、変数dataに読み込んだとして、最初の商品(しょうゆラーメン)にアクセスするためには、次のようにする。

data.product[0].code

上記の例なら、同様に塩ラーメンなら[1]、味噌ラーメンなら[2]を参照することになる。

関連する用語
JSONP
JSON-LD
Ajax

コメントなどを投稿するフォームは、日本語対応時のみ表示されます


KisoDic通信用語の基礎知識検索システム WDIC Explorer Version 7.04a (27-May-2022)
Search System : Copyright © Mirai corporation
Dictionary : Copyright © WDIC Creators club