MENU

JSON.stringify()を使ってカスタムログを作成する

毎回ログ仕込むのが地味にめんどくさくなってきたのでUtilをつくろうと思いメモとして残しておく。

目次

JSON.stringify()について

変換できるデータ型と結果

データ型変換結果
オブジェクトJSONオブジェクト
配列JSON配列
文字列JSON文字列
数値JSON数値
true, falsetrue, false
nullnull
undefined出力から除外される
関数出力から除外される
シンボル出力から除外される

replacer で出力内容をカスタマイズ

a. プロパティをフィルタリング

replacer に配列を渡すと、指定したキーだけが出力されます。

b. 値を動的に変換

replacer に関数を渡すと、値を動的に変更できます。

循環参照への対処

オブジェクト内で循環参照がある場合、JSON.stringify はエラーをスローします。

対処法: カスタム replacer を作成して循環参照を防ぐ。

toJSON メソッドを利用

オブジェクトが toJSON メソッドを持っている場合、JSON.stringify はこのメソッドを優先します。

注意点

シリアライズの制限

undefined、関数、シンボル はJSON文字列に含まれません。
配列内の undefined は null に変換されます。

日付オブジェクト

  • Date は ISO 8601 形式の文字列に変換されます。

Map や Set

MapSet はシリアライズされません。必要に応じて変換が必要です。

自作のカスタムログ関数を作成する

デフォルトの console.log をオーバーライドして、色付きの出力を作成

[MY LOG] が表示され、色が変更されます(デバッグターミナルで動作)。ただし、React Native の Metro Bundler や iOS/Android のログビューア(adb logcat など)では色付けが反映されないことがあり。

カラフルなログ

カラーコードについて

1. 標準的なANSIカラーコード(8色 + 明るい8色 = 16色)

基本8色

コード色名説明
\x1b[30mBlack
\x1b[31mRed
\x1b[32mGreen
\x1b[33m黄色Yellow
\x1b[34mBlue
\x1b[35mマゼンタMagenta
\x1b[36mシアンCyan
\x1b[37mWhite

明るいバージョン(Bright Colors)

コード色名説明
\x1b[90m明るい黒Bright Black (Gray)
\x1b[91m明るい赤Bright Red
\x1b[92m明るい緑Bright Green
\x1b[93m明るい黄色Bright Yellow
\x1b[94m明るい青Bright Blue
\x1b[95m明るいマゼンタBright Magenta
\x1b[96m明るいシアンBright Cyan
\x1b[97m明るい白Bright White
  • リセット: \x1b[0m(色設定を元に戻す)

2. 256色のANSIエスケープコード

  • 形式: \x1b[38;5;<n>m(前景色)、\x1b[48;5;<n>m(背景色)
  • <n> は0〜255の範囲で、次のように分類されます:
    • 0〜15: 標準色(基本8色 + 明るい8色)
    • 16〜231: 6x6x6のRGBカラーパレット
    • 232〜255: グレースケール(黒〜白)

3. 24ビットフルカラー(RGBカラー)

  • 形式: \x1b[38;2;<r>;<g>;<b>m(前景色)、\x1b[48;2;<r>;<g>;<b>m(背景色)
  • <r><g><b> はそれぞれ0〜255のRGB値。

4. 使えるカラーコードの数

標準: 8色 + 明るい8色 = 16色
256色モード: 16色 + 拡張240色 = 256色
フルカラー: 24ビットのRGBで 16,777,216色

5. 注意点

ターミナル依存: ANSIカラーコードがサポートされるかどうかは、使っているターミナル(やツール)に依存します。
Metro Bundler や Node.js ターミナルでは基本的なANSIカラー(16色や256色)が利用可能。
AndroidやiOSのネイティブログビューアでは色付けが無効になることがあります。
React Native 開発では、主にターミナル出力で使えるANSIカラー(16色〜256色)が実用的です。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

目次