この用語をシェア
JSONとは
JSON(JavaScript Object Notation)は、軽量なデータ交換フォーマットです。人間が読み書きしやすく、機械が解析・生成しやすい形式で、Web APIやデータ保存において広く使用されています。JavaScriptの記法をベースにしていますが、言語に依存しない汎用的なデータフォーマットです。
JSONの特徴
- 軽量:XMLと比較して記述が簡潔
- 可読性:人間が理解しやすい構造
- 言語非依存:ほとんどの言語でサポート
- 標準化:RFC 7159として標準化
- シンプル:構文が簡単で理解しやすい
JSONの構文
基本的なデータ型
データ型 | 例 | 説明 |
---|---|---|
文字列 | "Hello World" | ダブルクォートで囲まれた文字列 |
数値 | 123, 45.67 | 整数・浮動小数点数 |
論理値 | true, false | 真偽値 |
null | null | null値 |
オブジェクト | {"key": "value"} | キー・バリューペア |
配列 | [1, 2, 3] | 値の順序付きリスト |
基本的なJSONの例
{
"name": "田中太郎",
"age": 30,
"isActive": true,
"address": {
"city": "東京",
"zipcode": "100-0001"
},
"hobbies": ["読書", "映画鑑賞", "プログラミング"],
"spouse": null
}
JSONの構文ルール
- 文字列:必ずダブルクォートで囲む
- キー:必ず文字列で、ダブルクォートで囲む
- 値:文字列、数値、論理値、null、オブジェクト、配列のいずれか
- セパレータ:要素間はカンマで区切る
- 末尾のカンマ:最後の要素の後にカンマは付けない
- コメント:コメントは使用できない
JSONの使用例
Web APIのレスポンス
// GET /api/users/123 のレスポンス
{
"id": 123,
"name": "田中太郎",
"email": "tanaka@example.com",
"created_at": "2025-01-01T00:00:00Z",
"profile": {
"bio": "Webデベロッパー",
"skills": ["JavaScript", "Python", "Docker"],
"experience": 5
}
}
設定ファイル
// package.json
{
"name": "my-app",
"version": "1.0.0",
"description": "My awesome application",
"main": "index.js",
"scripts": {
"start": "node index.js",
"test": "jest"
},
"dependencies": {
"express": "^4.18.0",
"lodash": "^4.17.21"
},
"devDependencies": {
"jest": "^29.0.0"
}
}
プログラミング言語でのJSON操作
JavaScript
// JSON文字列をオブジェクトに変換
const jsonString = '{"name": "田中太郎", "age": 30}';
const obj = JSON.parse(jsonString);
console.log(obj.name); // "田中太郎"
// オブジェクトをJSON文字列に変換
const user = { name: "田中太郎", age: 30 };
const json = JSON.stringify(user);
console.log(json); // '{"name":"田中太郎","age":30}'
// 美しく整形
const prettyJson = JSON.stringify(user, null, 2);
/*
{
"name": "田中太郎",
"age": 30
}
*/
Python
import json
# JSON文字列を辞書に変換
json_string = '{"name": "田中太郎", "age": 30}'
data = json.loads(json_string)
print(data["name"]) # "田中太郎"
# 辞書をJSON文字列に変換
user = {"name": "田中太郎", "age": 30}
json_string = json.dumps(user, ensure_ascii=False)
print(json_string) # '{"name": "田中太郎", "age": 30}'
# 美しく整形
pretty_json = json.dumps(user, ensure_ascii=False, indent=2)
print(pretty_json)
Java
import com.fasterxml.jackson.databind.ObjectMapper;
// JSON文字列をオブジェクトに変換
String jsonString = "{\"name\": \"田中太郎\", \"age\": 30}";
ObjectMapper mapper = new ObjectMapper();
User user = mapper.readValue(jsonString, User.class);
System.out.println(user.getName()); // "田中太郎"
// オブジェクトをJSON文字列に変換
User newUser = new User("田中太郎", 30);
String json = mapper.writeValueAsString(newUser);
System.out.println(json);
JSONの検証
JSON Schema
JSON Schemaは、JSONデータの構造を定義・検証するためのスキーマ言語です。
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1
},
"age": {
"type": "integer",
"minimum": 0,
"maximum": 150
},
"email": {
"type": "string",
"format": "email"
}
},
"required": ["name", "age"]
}
JSONの利点
- シンプル:構文が簡潔で理解しやすい
- 軽量:XMLと比較してデータサイズが小さい
- 高速:パース速度が速い
- 広範囲サポート:ほとんどの言語でサポート
- ネイティブサポート:JavaScriptで直接扱える
JSONの制限
- データ型の制限:日付、関数、コメントは直接サポートされない
- 循環参照:オブジェクトの循環参照は表現できない
- 精度の問題:浮動小数点数の精度に制限がある
- セキュリティ:直接eval()すると危険
JSONとXMLの比較
特徴 | JSON | XML |
---|---|---|
可読性 | 高い | 中程度 |
データサイズ | 小さい | 大きい |
パース速度 | 速い | 遅い |
スキーマ | JSON Schema | XML Schema |
メタデータ | 制限あり | 豊富 |
名前空間 | なし | あり |
JSONの活用場面
- Web API:RESTful APIのデータ交換
- 設定ファイル:アプリケーションの設定
- データベース:NoSQLデータベースでのデータ保存
- ログ:構造化ログのフォーマット
- Ajax通信:Webアプリケーションでのデータ交換
JSONのベストプラクティス
- 命名規則:camelCase または snake_case を統一
- 一貫性:同じ構造のデータは同じ形式で統一
- 検証:JSON Schemaを使用した検証
- エラーハンドリング:パース時のエラー処理
- セキュリティ:信頼できないJSONの適切な処理
関連技術
- JSONP:クロスドメインでのJSON取得
- JSON-LD:Linked Data向けのJSON
- BSON:Binary JSON(MongoDB等で使用)
- MessagePack:効率的なバイナリシリアライゼーション
- YAML:人間が読みやすい設定ファイル形式
JSONツール
- JSONLint:JSON検証ツール
- jq:コマンドラインJSON processor
- Postman:API開発・テストツール
- JSON Schema Validator:スキーマ検証ツール