【JS応用|実務向け】JSON.parseの隠れた実力:reviver関数を使ったデータ変換の最適化

導入

フロントエンド開発において、APIから取得した日付文字列をDateオブジェクトに変換したり、特定の数値フォーマットを変換したりする作業は頻繁に発生します。これらをパース後に毎回ループ処理で変換していませんか?JSON.parseの第二引数である「reviver」関数を活用すれば、JSONの解析と同時にデータ変換を完了させることができ、コードの可読性と保守性を大幅に向上させることが可能です。

基礎知識

JSON.parse(text, reviver)は、JSON文字列をJavaScriptのオブジェクトに変換する標準メソッドです。第二引数のreviverは、パースの過程で「各プロパティ」に対して呼び出される変換関数です。この関数は、キー(key)と値(value)を引数に受け取り、返り値がそのプロパティの最終的な値として採用されます。再帰的にツリー構造の末端から順に処理されるため、複雑なネスト構造を持つデータでも一括で変換できるのが特徴です。

実装/解決策

reviver関数内で、現在の値が期待する形式(例えば、日付形式の文字列)であるかを判定し、該当すれば変換、そうでなければ元の値をそのまま返すロジックを組みます。これにより、サーバーから受け取った生データをアプリケーションで扱いやすい型に変換する工程を、パース処理の中に統合できます。

サンプルプログラム

以下のコードは、APIから受け取ったJSON文字列に含まれる「ISO 8601形式の日付文字列」を、自動的にDateオブジェクトに変換する実用例です。


// APIから取得したと想定されるJSON文字列
const jsonString = '{"id": 1, "name": "Project Alpha", "createdAt": "2023-10-27T10:00:00Z"}';

// reviver関数:日付文字列をDateオブジェクトに変換する
const data = JSON.parse(jsonString, (key, value) => {
  // ISO 8601形式の日付文字列を簡易的に判定(正規表現などを使用)
  const dateRegex = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}/;
  
  // 文字列であり、かつ日付形式にマッチする場合のみ変換
  if (typeof value === 'string' && dateRegex.test(value)) {
    return new Date(value);
  }
  
  // それ以外は元の値をそのまま返す
  return value;
});

console.log(data.createdAt instanceof Date); // true
console.log(data.createdAt.getFullYear()); // 2023

応用・注意点

reviverを使用する際は、以下の点に注意してください。

1. 変換ロジックの肥大化
reviver関数内に複雑な条件分岐を詰め込みすぎると、パース処理全体のパフォーマンスが低下します。特定の型変換に特化させるか、あるいは共通の変換関数を呼び出す形に整理しましょう。

2. 再帰的な実行
reviverはオブジェクトの階層を深く掘り下げて実行されます。ルートノードの処理も最後に行われるため、関数が意図せず全体を上書きしないよう、返り値の制御には注意が必要です。

3. 型安全性の確保
TypeScriptを使用している場合、JSON.parseの結果はany型になりがちです。reviverで変換をかけた後は、適切にインターフェースを定義し、型アサーションを行うか、Zodなどのバリデーションライブラリと組み合わせてデータの整合性を担保することを推奨します。

シンプルなデータ変換であれば、reviverは非常に強力な武器になります。ぜひ次回のプロジェクトで活用してみてください。

タイトルとURLをコピーしました