JSON
JSON(ジェイソン、JavaScript Object Notation)とは、JavaScriptのオブジェクトの文法をもとにした軽量データ記述言語およびデータシリアライゼーションフォーマットです。
文法
編集JSONは、JavaScriptの false / null / true / Object / Array / Number / String の7種類のオブジェクトのリテラルの組み合わせをシリアライズされたデータ形式 です(RFC8259)。多くの場合トップレベルのオブジェクトは Object(より一般的に用語で言えば、連想配列)であるが、仕様上は他の6種類のオブジェクトであってもよい。false
, null
, true
のいずれでも良いし、0
1文字でも有効なJSONのデータ です。このように自由度が高い形式ではあるが、Object のキーは String に限られるという制限があり、これがJavaScriptの内部オブジェクトと異なります。
JSONのデータ構造
編集JSONのデータ構造は、以下のようになっています。
- オブジェクト (Object)
- キーと値のペアの集合で構成される。
- キーは文字列で表され、値は任意のJSONデータ型である。
- オブジェクトは{ }で囲まれ、キーと値のペアはカンマ(,)で区切られる。
- キーと値のペアはキー: 値という形式で表される。
- 例
{ "name": "John", "age": 30, "isMarried": true, "hobbies": ["reading", "swimming", "traveling"], "address": { "city": "Tokyo", "country": "Japan" } }
- 配列 (Array)
- 値の集合で構成される。
- 配列は[ ]で囲まれ、値はカンマ(,)で区切られる。
- 配列の中には、任意のJSONデータ型を含めることができる。
- 例
["apple", "banana", "orange", 123, {"name": "John", "age": 30}]
- 文字列 (String)
- ダブルクォーテーション(")で囲まれた文字列で表される。
- 改行文字などの特殊文字をエスケープすることができる。
- 例
"Hello, World!"
- 数値 (Number)
- 整数または浮動小数点数で表される。
- 例
123 3.14
- 真偽値 (Boolean)
- trueまたはfalseで表される。
- 例
true false
- null
- nullで表される。
- 例
null
上記のデータ型を組み合わせることで、複雑なJSONデータ構造を作成することができます。また、これらのデータ型を扱うための様々なメソッドや関数が用意されています。
JSONのEBNF
編集JSONのEBNF(Extended Backus-Naur Form)は以下のようになります。
object = "{" [pair *( "," pair )] "}"; pair = string ":" value; array = "[" [value *( "," value )] "]"; value = string | number | object | array | "true" | "false" | "null"; string = '"' *( char | escape ) '"'; char = unescaped | escape ( "\" / "/" / "\"" / "b" / "f" / "n" / "r" / "t" ); escape = "\\" char; unescaped = %x20-21 / %x23-5B / %x5D-10FFFF; number = [ "-" ] int [ frac ] [ exp ]; int = "0" / digit1-9 *digit; frac = "." 1*digit; exp = ("e" / "E") ["-" / "+"] 1*digit; digit = "0" / digit1-9; digit1-9 = %x31-39;
- このEBNFでは、objectは{}で囲まれた0個以上のpairを含むオブジェクトを表します。pairは、stringで示されるキーとvalueで示される値のペアです。
- arrayは[]で囲まれた0個以上のvalueを含む配列を表します。
- valueは、string、number、object、array、true、false、nullのいずれかの値を表します。
- stringは、ダブルクォーテーションで囲まれたUnicode文字列を表します。エスケープシーケンスもサポートされます。
- numberは、10進数表記の数値を表します。負の値、小数点以下、指数表記もサポートされます。
このEBNFを基に、JSON形式のデータをパースするためのパーサーを作成することができます。
JavaScriptの例
編集- JSONのパース
const jsonString = '{"name": "John", "age": 30}'; const data = JSON.parse(jsonString); console.log(data.name); // "John" console.log(data.age); // 30
- JSONのシリアライズ
const data = {name: "John", age: 30}; const jsonString = JSON.stringify(data); console.log(jsonString); // '{"name":"John","age":30}'