JSON
JavaScript 由来の軽量なデータ交換フォーマットで、Web API のデファクトスタンダード
データ形式Web
JSON とは
JSON (JavaScript Object Notation) は、Douglas Crockford が 2001 年に標準化した軽量なデータ交換フォーマットである。人間にも機械にも読みやすく、ほぼすべてのプログラミング言語でパーサーが提供されている。Web API のレスポンス形式として事実上の標準だ。
データ型
{
"string": "Hello",
"number": 42,
"float": 3.14,
"boolean": true,
"null": null,
"array": [1, 2, 3],
"object": { "key": "value" }
}
| 型 | 例 | 注意点 |
|---|---|---|
| 文字列 | "hello" |
ダブルクォートのみ (シングル不可) |
| 数値 | 42, 3.14 |
Infinity, NaN は不可 |
| 真偽値 | true, false |
|
| null | null |
undefined は不可 |
| 配列 | [1, 2, 3] |
|
| オブジェクト | {"key": "value"} |
キーは文字列のみ |
JSON にないもの
- コメント (
//,/* */) - 末尾カンマ (
[1, 2, 3,]) undefined,Infinity,NaN- 日付型 (文字列として
"2026-04-01T00:00:00Z"で表現) - BigInt
TypeScript での操作
// シリアライズ
const json = JSON.stringify({ name: 'Alice', age: 30 });
// '{"name":"Alice","age":30}'
// デシリアライズ (戻り値は any → 型検証が必要)
const data = JSON.parse(json); // any 型
// ✅ Zod でバリデーション + 型推論
import { z } from 'zod';
const UserSchema = z.object({ name: z.string(), age: z.number() });
const user = UserSchema.parse(JSON.parse(json)); // { name: string; age: number }
JSON vs 他のフォーマット
| フォーマット | 用途 | コメント | 型の厳密さ |
|---|---|---|---|
| JSON | API、データ交換 | 不可 | 中程度 |
| YAML | 設定ファイル、CI/CD | 可能 | 曖昧 |
| TOML | 設定ファイル | 可能 | 厳密 |
| Protocol Buffers | マイクロサービス間通信 | - | 厳密 (スキーマ必須) |
DynamoDB と JSON
DynamoDB のアイテムは JSON に似た構造だが、型情報が付与される。
// DynamoDB のアイテム (マーシャリング形式)
{ "userId": { "S": "123" }, "age": { "N": "30" }, "tags": { "L": [{ "S": "admin" }] } }
// AWS SDK v3 のマーシャリングで通常の JSON として扱える
{ "userId": "123", "age": 30, "tags": ["admin"] }
JSON Lines (JSONL)
1 行に 1 つの JSON オブジェクトを記述する形式。ログファイルやストリーミング処理で使われる。
{"timestamp":"2026-04-01T10:00:00Z","level":"INFO","message":"Request received"}
{"timestamp":"2026-04-01T10:00:01Z","level":"ERROR","message":"DB connection failed"}
Athena で S3 上の JSONL ファイルを直接クエリできる。
JSON の理解を深めるには関連書籍が参考になる。