1文字でも有効なJSONのデータ です。このように自由度が高い形式ではあるが、Object のキーは String に限られるという制限があり、これがJavaScriptの内部オブジェクトと異なります。
JSONのデータ構造は、以下のようになっています。
キーと値のペアの集合で構成される。
キーは文字列で表され、値は任意のJSONデータ型である。
オブジェクトは{ }で囲まれ、キーと値のペアはカンマ(,)で区切られる。
キーと値のペアはキー: 値という形式で表される。
{
  "name": "John",
  "age": 30,
  "isMarried": true,
  "hobbies": ["reading", "swimming", "traveling"],
  "address": {
    "city": "Tokyo",
    "country": "Japan"
  }
}
値の集合で構成される。
配列は[ ]で囲まれ、値はカンマ(,)で区切られる。
配列の中には、任意のJSONデータ型を含めることができる。
["apple", "banana", "orange", 123, {"name": "John", "age": 30}]
ダブルクォーテーション(")で囲まれた文字列で表される。
改行文字などの特殊文字をエスケープすることができる。
"Hello, World!"
整数または浮動小数点数で表される。
123
3.14
trueまたはfalseで表される。
true
false
nullで表される。
null
上記のデータ型を組み合わせることで、複雑なJSONデータ構造を作成することができます。また、これらのデータ型を扱うための様々なメソッドや関数が用意されています。
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形式のデータをパースするためのパーサーを作成することができます。
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}'