YAMLとJSONの日付・タイムスタンプ処理

YAMLとJSONの変換で日付やタイムスタンプがどのように異なる扱いを受けるかを学びます。暗黙的な日付解析、ISO 8601形式、意図しない型変換の回避方法を解説します。

Data Types

詳細な説明

日付の扱いはJSONとYAMLの微妙だが重要な違いです。JSONにはネイティブな日付型がなく、日付は常に文字列です。一方、YAMLは日付のような値を暗黙的に日付オブジェクトに解析できるため、変換時に予期しない動作が発生する可能性があります。

YAMLの暗黙的日付解析:

# YAML 1.1ではこれらが自動的に日付として解析される:
created: 2024-01-15
updated: 2024-01-15T10:30:00Z
time_only: 10:30:00

# これらは文字列のまま:
version: "2024.01"
not_a_date: "2024-01-15"

JSONに変換(パーサーにより動作が異なる):

{
  "created": "2024-01-15T00:00:00.000Z",
  "updated": "2024-01-15T10:30:00Z",
  "time_only": 38400,
  "version": "2024.01",
  "not_a_date": "2024-01-15"
}

問題: YAMLで created: 2024-01-15 と書くと、一部のパーサーは文字列ではなくDateオブジェクトとして解釈します。JSONにシリアライズされると、パーサーの実装に応じて完全なISO 8601タイムスタンプやUnixタイムスタンプになる場合があります。

YAML 1.1で認識される一般的な日付形式:

  • 2024-01-15(日付のみ)
  • 2024-01-15T10:30:00Z(タイムゾーン付きISO 8601)
  • 2024-01-15 10:30:00 +09:00(オフセット付き)
  • 2024-1-15(先頭ゼロなし)

YAML 1.2では暗黙的な日付型検出は削除されましたが、多くの人気パーサー(PyYAML、js-yamlのデフォルトモード)はまだYAML 1.1の動作を使用しています。

安全な変換のベストプラクティス:

  1. 日付文字列をYAMLでクォートして文字列として維持したい場合:created: "2024-01-15"
  2. 日付を意図する場合はISO 8601形式を一貫して使用2024-01-15T00:00:00Z
  3. パーサーのYAMLバージョンを確認。 実際の日付値でテストして動作を確認しましょう。
  4. JSONからYAMLに変換する際、日付のような文字列は意図しない解析を防ぐためにクォートすべきです。

最も安全なアプローチは、明示的に日付型の解析を望む場合を除き、YAMLでは常に日付値をクォートすることです。

ユースケース

ISO 8601日付文字列を含むJSON APIレスポンスをYAML設定ファイルに変換する際に、日付が文字列のまま維持され、YAMLパーサーによって暗黙的にDateオブジェクトに変換されないようにする場合。

試してみる — JSON ↔ YAML Converter

フルツールを開く