JSON完全ガイド:基礎から応用まで
構文、検証、ベストプラクティス、よくある落とし穴をカバーするこの包括的なガイドでJSONをマスター。
JSONとは?
JSON(JavaScript Object Notation)は、軽量でテキストベースのデータ交換フォーマットです。 名前がJavaScriptとの関連を示唆していますが、JSONは言語に依存せず、 ほとんどの現代プログラミング言語で使用できます。
なぜJSONを使用するのか?
- 人間に読みやすく理解しやすい
- 最小限の構文で軽量
- JavaScriptのネイティブサポート
- プログラミング言語全体で幅幅幅サポート
- APIや設定ファイルに最適
JSON構文とデータ型
JSON構文は二つの構造に基づいています:名前/値のペアのコレクションと 値の順序付きリストです。JSONは6つの基本データ型をサポートしています:
String
"Hello World", "user@example.com"
常にダブルクォートを使用、シングルクォートは使用しない
Number
42, -17, 3.14159, 1.23e-4
整数または浮動小数点、正または負
Boolean
true, false
小文字のみ、クォートなし
null
null
空の値を表す、小文字のみ
Object
{"name": "John", "age": 30}
中括弧内のキー/値ペアのコレクション
Array
[1, 2, 3]
["apple", "banana", "cherry"]
角括弧内の値の順序付きリスト
JSON構文ルール
- データは名前/値ペアで表現
- データはカンマで区切られる
- オブジェクトは中括弧で囲まれる
- 配列は角括弧[]で囲まれる
- 文字列はダブルクォートを使用する必要がある
- 末尾のカンマは許可されない
- コメントは許可されない
JavaScriptでのJSONの扱い
JSONのパーシング
JSON文字列をJavaScriptオブジェクトに変換:
// 基本的なパーシング
const jsonString = '{"name": "John", "age": 30}';
const obj = JSON.parse(jsonString);
console.log(obj.name); // "John"
// パーシングエラーの処理
try {
const data = JSON.parse(invalidJsonString);
} catch (error) {
console.error('無効なJSON:', error.message);
}
オブジェクトの文字列化
JavaScriptオブジェクトをJSON文字列に変換:
const user = {
name: 'Alice',
age: 25,
hobbies: ['reading', 'coding'],
isActive: true
};
const jsonString = JSON.stringify(user);
console.log(jsonString);
// {"name":"Alice","age":25,"hobbies":["reading","coding"],"isActive":true}
// インデント付きの見やすい印刷
const prettyJson = JSON.stringify(user, null, 2);
console.log(prettyJson);
高度なJSON.stringifyオプション
const data = {
name: 'John',
password: 'secret123',
age: 30,
email: 'john@example.com'
};
// 特定のプロパティをフィルター
const filtered = JSON.stringify(data, ['name', 'age']);
// {"name":"John","age":30}
// replacer関数で値を変換
const transformed = JSON.stringify(data, (key, value) => {
if (key === 'password') return undefined; // パスワードを除外
if (typeof value === 'string') return value.toUpperCase();
return value;
});
// カスタムtoJSONメソッド
const customObject = {
value: 42,
toJSON() {
return { customValue: this.value * 2 };
}
};
JSON検証
JSON検証は、データが正しいフォーマットと構造に従っていることを保証します。
基本的な検証
function isValidJSON(str) {
try {
JSON.parse(str);
return true;
} catch (e) {
return false;
}
}
// 使用方法
console.log(isValidJSON('{"name": "John"}')); // true
console.log(isValidJSON("{'name': 'John'}")); // false (シングルクォート)
console.log(isValidJSON('{"name": "John",}')); // false (末尾カンマ)
スキーマ検証
より堅牢な検証には、JSON Schemaの使用を検討してください:
// JSON Schemaの例
const userSchema = {
type: "object",
properties: {
name: { type: "string", minLength: 1 },
age: { type: "number", minimum: 0, maximum: 150 },
email: { type: "string", format: "email" }
},
required: ["name", "age"],
additionalProperties: false
};
ベストプラクティス
一貫した命名を使用
JSON構造全体でcamelCaseまたはsnake_caseを一貫して使用してください。
可能な限りフラットに保つ
パフォーマンスと可読性のために不必要なネストを避けてください。
意味のあるプロパティ名を使用
データの目的を明確に示す説明的な名前を選んでください。
適切な場合はメタデータを含める
APIレスポンスにタイムスタンプ、バージョン、またはステータスフィールドを追加してください。
大きな数値を注意深く扱う
非常に大きな整数に対するJavaScriptの数値精度制限に注意してください。
よくある間違いとその回避方法
末尾カンマ
JSONはJavaScriptオブジェクトとは異なり、末尾カンマを許可しません。
❌ 無効
{
"name": "John",
"age": 30,
}
✅ 有効
{
"name": "John",
"age": 30
}
シングルクォート
JSONは文字列とプロパティ名にダブルクォートが必要です。
❌ 無効
{'name': 'John'}
✅ 有効
{"name": "John"}
undefinedと関数
JSONはundefined値や関数を表現できません。
// これらはJSON.stringify()時に省略されます
const obj = {
name: "John",
undefinedValue: undefined,
func: function() { return "hello"; }
};
日付の扱い
JSONにはネイティブな日付型がありません。ISO 8601文字列を使用してください。
// 推奨される日付フォーマット
{
"createdAt": "2024-01-15T10:30:00.000Z",
"updatedAt": "2024-01-15T14:45:30.000Z"
}
高度なトピック
JSONストリーミング
大きなデータセットの場合、パフォーマンス向上のためにJSONストリーミングパーシングを検討してください:
// ストリーミングパーサーを使用した例(概念的)
const streamParser = new JSONStreamParser();
streamParser.on('object', (obj) => {
// パーシングされた各オブジェクトを処理
processObject(obj);
});
streamParser.on('error', (error) => {
console.error('Parsing error:', error);
});
// データをチャンク単位で供給
chunks.forEach(chunk => streamParser.write(chunk));
JSON Schema検証
本番アプリケーションでの包括的な検証にはJSON Schemaを使用してください:
const Ajv = require('ajv');
const ajv = new Ajv();
const schema = {
type: "object",
properties: {
productId: { type: "string", pattern: "^[A-Z0-9]{5,10}$" },
name: { type: "string", minLength: 1, maxLength: 100 },
price: { type: "number", minimum: 0, multipleOf: 0.01 },
categories: {
type: "array",
items: { type: "string" },
minItems: 1,
uniqueItems: true
}
},
required: ["productId", "name", "price"],
additionalProperties: false
};
パフォーマンスの考慮事項
最適化のヒント
- 頻繁に送信されるデータにはより短いプロパティ名を使用
- 大きなデータセットにはバイナリフォーマット(MessagePack、Protocol Buffers)を検討
- APIレスポンスに圧縮(gzip)を実装
- 可能な限りパーシングしたJSONオブジェクトをキャッシュ
- データ変換にJSON.parse()のreviver関数を使用
実世界の例
APIレスポンス構造
{
"status": "success",
"data": {
"users": [
{
"id": "usr_123",
"name": "Alice Johnson",
"email": "alice@example.com",
"profile": {
"avatar": "https://example.com/avatars/alice.jpg",
"bio": "Software developer passionate about clean code"
},
"settings": {
"theme": "dark",
"notifications": true,
"language": "en"
},
"createdAt": "2024-01-15T10:30:00.000Z",
"lastActive": "2024-01-15T14:45:30.000Z"
}
]
},
"pagination": {
"page": 1,
"limit": 20,
"total": 156,
"hasNext": true
},
"meta": {
"requestId": "req_abc123",
"timestamp": "2024-01-15T14:45:30.000Z",
"version": "1.0"
}
}
まとめ
JSONは現代の開発者にとって不可欠なスキルです。その構文を理解し、 ベストプラクティスに従い、よくある落とし穴を避けることで、 アプリケーションでのデータ交換、設定、保存にJSONを効果的に使用できます。 JSONを検証し、エラーを適切に処理し、大きなデータセットのパフォーマンスへの影響を考慮することを忘れないでください。