名前付きデータの集合体です。 ここでも「いかに簡潔に書くか」「いかに安全に書くか」が進化しています。
JSONは、 「データをやり取りするための共通ルール(フォーマット)」 です。 JavaScriptの書き方をベースにしていますが、JSのオブジェクトそのものではありません。
「JSのオブジェクト」と「JSON」の違いは、「組み立て済みの家具」 と 「段ボールに入った家具」 に例えられます。
user.name のように直接データを取り出したり、書き換えたりできます。インターネットを通じてデータを送るには、一度段ボール(JSON)に梱包する 必要があります。
JSON.stringify)JSON.parse)構文ルールは 「キーを必ず
" "
(ダブルクォート) で囲む」 こと。非常に厳格です。
{
"id": 101,
"name": "田中 太郎",
"isAdmin": false
}
配列 [ ] の中にオブジェクト { } が複数並ぶ、データ一覧などを表現する際によく使うパターンです。
[
{ "id": 1, "name": "PC", "price": 100000 },
{ "id": 2, "name": "Mouse", "price": 3000 }
]
オブジェクトの中にオブジェクト/配列を「入れ子」にすると綺麗に表現できます。
{
"event": "学園祭",
"location": "A棟ホール",
"schedule": [
{ "time": "10:00", "title": "開会式" },
{ "time": "11:00", "title": "LIVE" }
],
"contact": {
"email": "info@example.com",
"tel": "03-xxxx-xxxx"
}
}
JSONでは、プログラムで使う主要なデータをすべて表現できます。
型 | 例 | 備考 |
文字列 |
| 必ずダブルクォート |
数値 |
| そのまま書く |
真偽値 |
| そのまま書く |
Null |
| 空であることを示す |
配列 |
| データのリスト |
オブジェクト |
| 名前付きデータの集合 |
全体が大きなObjectであり、その中にまた別のObjectが入ります。
{ "allowList": {
"user_123": { "read": true, "write": false, "roles": ["editor"] }
,
"user_456": { "read": true, "write": true, "roles": ["admin"] }
} }
青い枠
{ }
: 全体のデータ
プロパティ名 allowList にデータをまとめています。
緑の枠
{ }
: 各ユーザーごとの詳細データ
これも立派なひとつのObjectです。
このように、JSONではObjectをマトリョーシカのように重ねることで、大規模で複雑なデータも整理して送ることができます。
深層にあるデータにアクセスする際、途中に null があるとアプリがクラッシュすることがあります。
const user = null;
const name = user.profile.name;
// TypeError: Cannot read properties of null
API通信待ちの間など、データが不完全な状態は頻繁に起こります。 いちいち if でチェックするのは大変です。
?.「もしあれば進む、なければそこで止まる」 演算子です。
const user = {};
// エラー! (Cannot read property 'name' of undefined)
// console.log(user.profile.name);
// エラーにならず、undefined が返る
console.log(user.profile?.name);
「もしかしたら無いかもしれない」データには、迷わず ?. をつけましょう。
オブジェクトを組み立てる時、変数名とプロパティ名が同じなら : 以降を省略できます。 非常に頻繁に使われる、基本テクニックです。
const name = "Shake";
const role = "Admin";
// 昔:わざわざ同じ名前を2回書いていた
const oldUser = { name: name, role: role };
// 今:スッキリ!
const newUser = { name, role };
console.log(newUser); // { name: "Shake", role: "Admin" }
今度はオブジェクトからデータを取り出す時の魔法です。 いちいち user.name のように書かず、構造に合わせて一発で変数として抽出します。
const user = { id: 1, name: "Shake", role: "Admin" };
// 昔:一つずつ取り出していた
const oldId = user.id;
const oldName = user.name;
// 今:左辺に {} を書いて一気に取り出す!
const { id, name } = user;
console.log(name); // "Shake"
APIから来たデータの名前が分かりにくい時などにリネームします。
const user = { id: 1, name: "Shake", role: "Admin" };
const { name: userName } = user;
console.log(userName); // "Shake" (name変数は作られない)
深い階層のデータも一発で取れます。
const response = { data: { title: "Hello" } };
const {
data: { title },
} = response;
console.log(title); // "Hello"
const baseUser = { name: "Shake", active: false };
const extraInfo = { role: "Admin" };
// baseUserの中身を展開し、activeだけ true で上書きしつつ合体
const updatedUser = {
...baseUser,
...extraInfo,
active: true
};
console.log(updatedUser); // { name: "Shake", role: "Admin", active: true }
// { name: "Shake", role: "Admin", active: true }
モダンなJavaScriptでは、オブジェクトを 「より短く・よりスマートに」 扱うための記法が進化しています。
: 以降を省略可能。{ } を使って、構造に合わせて一発で変数を取り出す。これらの記法は、今後の Hono / React 開発で 息をするように使います。少しずつ慣れていきましょう!