コンテンツにスキップ

JSON5

出典: フリー教科書『ウィキブックス(Wikibooks)』

はじめに

[編集]

JSON5は、人間が読み書きしやすいように設計されたJSONの拡張フォーマットです。2012年に開発が開始され、2022年時点で週間6500万ダウンロードを超える人気を誇り、ChromiumNext.jsBabelRetoolなどの主要プロジェクトで採用されています。

JSON5の特徴

[編集]

JSON5は、ECMAScript 5.1の構文要素を取り入れたJSONのスーパーセットです。すべての有効なJSONファイルは有効なJSON5ファイルとなります。以下に主な特徴を示します。

オブジェクトの拡張

[編集]

ECMAScript 5.1のIdentifierNameをキーとして使用できるようになり、より直感的な記述が可能です:

{
  unquoted: "値が使えます",
  with-dash: "ダッシュも可能",
  trailing-comma: "最後のカンマもOK",
}

文字列の柔軟性

[編集]

シングルクォートとマルチライン文字列をサポートしています:

{
  singleQuotes: 'シングルクォートが使えます',
  multiline: 'この文字列は\
             複数行に\
             わたります',
  quotes: 'シングルクォート内では"ダブルクォート"が使えます'
}

数値表現の拡張

[編集]

16進数や特殊な数値表現をサポートしています:

{
  hex: 0xdecafe,
  infinity: Infinity,
  negativeInfinity: -Infinity,
  leadingPoint: .123,
  trailingPoint: 123.,
  positiveSign: +1,
  notANumber: NaN
}

コメントのサポート

[編集]

設定ファイルの可読性を高めるコメントを記述できます:

{
  // 一行コメント
  key: "value",
  
  /* 複数行
     コメント */
  another: "value"
}

実践的な使用例

[編集]

設定ファイル

[編集]

JSON5は設定ファイルとして特に有用です:

{
  // サーバー設定
  server: {
    port: 8080,
    host: 'localhost',
    timeout: 30000,
  },

  // データベース設定
  database: {
    host: 'db.example.com',
    user: 'admin',
    /* パスワードは環境変数から
       読み込むことを推奨 */
    password: process.env.DB_PASSWORD,
    maxConnections: 100,
  },

  // ロギング設定
  logging: {
    level: 'info',
    file: '/var/log/app.log',
    rotate: {
      size: '10M',
      keep: 5,
    },
  },
}

プログラムでの使用

[編集]

Node.jsでの使用

[編集]

Node.jsでJSON5を使用する方法を示します:

const JSON5 = require('json5');

// パース
const data = JSON5.parse(`{
  // コメント
  key: 'value',
  number: 0xdecaf,
}`);

// 文字列化
const str = JSON5.stringify(data, null, 2);

ブラウザでの使用

[編集]

ブラウザ環境でのJSON5の使用方法です:

<script src="https://unpkg.com/json5@2/dist/index.min.js"></script>
<script>
  const config = JSON5.parse(`{
    theme: 'dark',
    fontSize: 14,
  }`);
</script>

API リファレンス

[編集]

JSON5.parse()

[編集]

JSON5文字列をパースしてJavaScriptオブジェクトを生成します:

const result = JSON5.parse(text[, reviver])

パラメータ:

  • text: パースするJSON5文字列
  • reviver: (オプション)パース結果を変換するための関数

JSON5.stringify()

[編集]

JavaScriptオブジェクトをJSON5文字列に変換します:

const text = JSON5.stringify(value[, replacer[, space]])

パラメータ:

  • value: 変換する値
  • replacer: (オプション)変換プロセスを制御する関数または配列
  • space: (オプション)出力を整形するための空白文字

ベストプラクティス

[編集]

設定ファイルでの使用

[編集]

設定ファイルを作成する際の推奨プラクティス:

{
  // 環境固有の設定
  development: {
    debug: true,
    apiUrl: 'http://localhost:3000',
    // 開発環境特有の設定をグループ化
    devTools: {
      enabled: true,
      port: 8080,
    },
  },

  // 共通設定
  common: {
    // 定数は大文字で記述
    MAX_RETRY: 3,
    TIMEOUT: 5000,
    
    // 関連する設定をグループ化
    auth: {
      tokenExpiry: '24h',
      refreshToken: true,
    },
  },
}

エラー処理

[編集]

JSON5使用時の適切なエラー処理:

try {
  const config = JSON5.parse(configString);
} catch (error) {
  if (error instanceof SyntaxError) {
    console.error('設定ファイルの構文エラー:', error.message);
  } else {
    console.error('予期せぬエラー:', error);
  }
}

トラブルシューティング

[編集]

よくある問題と解決策

[編集]

構文エラー

[編集]

問題:

{
  key: 'value'   // 最後のカンマが必要な場合がある
}

解決策:

{
  key: 'value',  // トレイリングカンマを追加
}

文字列のエスケープ

[編集]

問題:

{
  path: 'C:\path\to\file'  // バックスラッシュがエスケープされていない
}

解決策:

{
  path: 'C:\\path\\to\\file'  // バックスラッシュをエスケープ
}

附録

[編集]

JSON5とJSONの比較

[編集]
機能 JSON JSON5
コメント 非サポート サポート(一行・複数行)
クォート ダブルクォートのみ シングル・ダブルクォート
キー クォート必須 識別子形式可
末尾カンマ 非サポート サポート
16進数 非サポート サポート