JSONベストプラクティス:フォーマット、検証、パース

· 12分で読む

目次

JSONの基礎

JSON(JavaScript Object Notation)は、Web上で最も広く使用されているデータ交換フォーマットです。人間が読みやすく、言語に依存せず、事実上すべてのプログラミング言語でサポートされています。信頼性の高いAPI、設定ファイル、データパイプラインを構築するには、JSONのベストプラクティスを理解することが不可欠です。

JSONはもともとJavaScriptから派生しましたが、現在では普遍的な標準となっています。そのシンプルさと柔軟性により、サーバーとWebアプリケーション間のデータ送信、設定の保存、APIレスポンスの文書化に最適です。

コアデータ型

JSONは正確に6つのデータ型をサポートしています。適切なJSON設計には、これらの制限を理解することが重要です:

{
  "string": "Hello, World!",
  "number": 42,
  "decimal": 3.14,
  "boolean": true,
  "null_value": null,
  "array": [1, 2, 3],
  "object": {"nested": "value"}
}
データ型 説明
string 二重引用符で囲まれたテキスト "Hello"
number 整数または浮動小数点数 42, 3.14
boolean 真または偽の値 true, false
null 値の欠如を表す null
array 順序付けられた値のリスト [1, 2, 3]
object 順序なしのキーと値のペア {"key": "value"}

重要: JSONはコメント、末尾のカンマ、単一引用符、undefined、関数、またはネイティブの日付オブジェクトをサポートしていません。日付は文字列として表現する必要があり、通常はISO 8601形式を使用します。

JSONを使用するタイミング

JSONは特定のシナリオで優れています:

複雑なデータ検証のニーズには、JSONフォーマッターを使用して、デプロイ前にデータ構造が有効であることを確認することを検討してください。

フォーマット標準

一貫したフォーマットにより、JSONが読みやすく、保守しやすく、デバッグしやすくなります。確立された規則に従うことで、エラーが減り、チーム間のコラボレーションが向上します。

2スペースインデントを使用

2スペースインデントはJSONの業界標準です。過度な空白なしに明確な視覚的階層を提供します。

// ✅ 良い: 2スペースインデント
{
  "user": {
    "name": "Jane",
    "email": "[email protected]",
    "preferences": {
      "theme": "dark",
      "notifications": true
    }
  }
}

// ❌ 悪い: インデントなし(最小化)
{"user":{"name":"Jane","email":"[email protected]"}}

最小化されたJSONは帯域幅を削減するために本番APIに適していますが、開発とドキュメント用には常にフォーマットされたバージョンを維持してください。

キーにはcamelCaseを使用

一貫したキーの命名により混乱を防ぎ、JSONをより予測可能にします。camelCaseはJSON APIで最も一般的な規則です。

// ✅ 良い: camelCase
{
  "firstName": "Jane",
  "lastName": "Smith",
  "emailAddress": "[email protected]",
  "createdAt": "2026-03-15T10:30:00Z",
  "isActive": true
}

// ❌ スタイルの混在を避ける
{
  "first_name": "Jane",      // snake_case
  "LastName": "Smith",       // PascalCase
  "email-address": "...",    // kebab-case
  "CREATED_AT": "..."        // SCREAMING_SNAKE_CASE
}

プロのヒント: Pythonバックエンドを使用している場合、snake_caseに遭遇する可能性があります。1つの規則を選択し、API全体でそれを守ってください。必要に応じて変換レイヤーを使用して規則間で変換します。

日付にはISO 8601を使用

JSONにはネイティブの日付型がないため、常にISO 8601形式の文字列を使用してください。これにより、異なるプログラミング言語とタイムゾーン間で一貫した解析が保証されます。

{
  "createdAt": "2026-03-15T10:30:00Z",           // UTC時刻
  "updatedAt": "2026-03-15T14:45:00+08:00",     // タイムゾーンオフセット付き
  "date": "2026-03-15",                          // 日付のみ
  "time": "10:30:00"                             // 時刻のみ
}

意味のあるキー名を使用

説明的なキーにより、JSONが自己文書化され、外部ドキュメントの必要性が減ります。

// ✅ 良い: 説明的なキー
{
  "totalItemCount": 42,
  "isActive": true,
  "errorMessage": "Invalid email format",
  "maxRetryAttempts": 3
}

// ❌ 悪い: 不可解な略語
{
  "cnt": 42,
  "act": true,
  "err": "Invalid email format",
  "mra": 3
}

深いネストを避ける

深くネストされた構造は読みにくく、解析が困難です。最大3〜4レベルのネストを目指してください。

// ✅ 良い: フラットな構造
{
  "userId": "123",
  "userName": "Jane",
  "userEmail": "[email protected]",
  "addressStreet": "123 Main St",
  "addressCity": "Boston"
}

// ❌ 悪い: 過度なネスト
{
  "user": {
    "details": {
      "personal": {
        "name": {
          "first": "Jane"
        }
      }
    }
  }
}

検証テクニック

JSONを検証することで、データの整合性が確保され、ランタイムエラーが防止されます。検証には複数のアプローチがあり、それぞれ異なるユースケースに適しています。

JSONスキーマ検証

JSONスキーマは、JSONドキュメントに注釈を付けて検証するための強力な語彙です。JSONデータ構造の契約を提供します。

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "minLength": 1,
      "maxLength": 100
    },
    "email": {
      "type": "string",
      "format": "email"
    },
    "age": {
      "type": "integer",
      "minimum": 0,
      "maximum": 150
    }
  },
  "required": ["name", "email"]
}

人気のあるJSONスキーマバリデーターには以下が含まれます:

ランタイム検証

特に外部ソースやユーザー入力からデータを受信する場合は、常にランタイムでJSONデータを検証してください。

// try-catchを使用したJavaScriptの例
function validateJSON(jsonString) {
  try {
    const data = JSON.parse(jsonString);
    
    // 追加の検証
    if (!data.email || !data.email.includes('@')) {
      throw new Error('Invalid email format');
    }
    
    return { valid: true, data };
  } catch (error) {
    return { valid: false, error: error.message };
  }
}

オンライン検証ツール

開発中の迅速な検証には、即座に構文チェックとフォーマットを提供するJSONフォーマッターのようなオンラインツールを使用してください。また、差分チェッカーを使用してJSON構造を比較し、不一致を特定することもできます。

クイックヒント: プリコミットフックを設定して、バージョン管理にコミットされる前にJSONファイルを自動的に検証します。これにより、開発プロセスの早い段階でフォーマットエラーをキャッチできます。

JavaScriptでのJSONパース

JavaScriptはJSONを扱うためのネイティブメソッドを提供しています。これらのメソッドとそのエッジケースを理解することは、堅牢なアプリケーションにとって不可欠です。

JSON.parse()メソッド

JSON.parse()メソッドは、JSON文字列をJavaScriptオブジェクトに変換します。

const jsonString = '{"name":"Jane","age":30}';
const obj = JSON.parse(jsonString);

console.log(obj.name); // "Jane"
console.log(obj.age);  // 30

パースエラーの処理

不正なJSONを適切に処理するために、常にJSON.parse()をtry-catchブロックでラップしてください。

function safeJSONParse(jsonString, fallback = null) {
  try {
    return JSON.parse(jsonString);
  } catch (error) {
    console.error('JSON parse error:', error.message);
    return fallback;
  }
}

// 使用法
const data = safeJSONParse(userInput, { error: 'Invalid JSON' });

JSON.stringify()メソッド

JSON.stringify()メソッドは、JavaScriptオブジェクトをJSON文字列に変換します。

const obj = {
  name: "Jane",
  age: 30,
  hobbies: ["reading", "coding"]
};

// 基本的な使用法
const jsonString = JSON.stringify(obj);

// インデント付きの整形出力
const formatted = JSON.stringify(obj, null, 2);

// カスタムreplacer関数
const filtered = JSON.stringify(obj, ['name', 'age']); // 特定のキーのみを含める

reviver関数を使用した高度なパース

reviver関数を使用すると、パース中に値を変換できます。日付文字列をDateオブジェクトに変換する場合に便利です。

const jsonString = '{"name":"Jane","createdAt":"2026-03-15T10:30:00Z"}';

const obj = JSON.parse(jsonString, (key, value) => {
  if (key === 'createdAt') {
    return new Date(value);
  }
  return value;
});

console.log(obj.createdAt instanceof Date); // true

特殊値の処理

JSONシリアライゼーション中にJavaScriptが特殊値をどのように処理するかに注意してください:

const obj = {
  func: function() {},      // 関数は省略される
  undef: undefined,         // undefinedは省略される
  symbol: Symbol('test'),   // シンボルは省略される
  date: new Date(),         // 日付は文字列になる
  nan: NaN,                 // NaNはnullになる
  infinity: Infinity        // Infinityはnullになる
};

console.log(JSON.stringify(obj));
// {"date":"2026-03-31T10:30:00.000Z","nan":null,"infinity":null}

プロのヒント: 開発中は読みやすい出力のためにJSON.stringify()の第3パラメータを2に設定しますが、本番環境ではペイロードサイズを最小化するために省略してください。

PythonでのJSONパース

Pythonの組み込みjsonモジュールは、JSON操作の包括的なサポートを提供します。高速で信頼性が高く、外部依存関係なしでほとんどのユースケースを処理します。

JSONデータの読み込み

Pythonは、JSONを読み込むための2つの主要なメソッドを提供します:文字列用のjson.loads()とファイルオブジェクト用のjson.load()です。

import json

# JSON文字列をパース
json_string = '{"name": "Jane", "age": 30}'
data = json.loads(json_string)

# ファイルからJSONを読み込む
with open('data.json', 'r') as file:
    data = json.load(file)

print(data['name'])  # "Jane"

JSONデータのダンプ

同様に、Pythonは文字列用のjson.dumps()とファイル用のjson.dump()を提供します。

import json

data = {
    "name": "Jane",
    "age": 30,
    "hobbies": ["reading", "coding"]
}

# JSON文字列に変換
json_string = json.dumps(data, indent=2)

# ファイルに書き込む
with open('output.json', 'w') as file:
    json.dump(data, file, indent=2)

カスタムオブジェクトの処理

PythonオブジェクトはJSONに直接シリアライズできません。複雑な型にはカスタムエンコーダーを使用してください。

import json
from datetime import datetime
from decimal import Decimal

class