JSONとYAMLの数値精度とフォーマット

JSONとYAMLが大きな数値、浮動小数点精度、特殊な数値、8進数や16進数などの異なる数値フォーマットをどう扱うかを理解します。

Data Types

詳細な説明

数値は一般的なケースではJSONとYAMLで同様に扱われますが、精度、特殊な値、代替フォーマットに関するエッジケースは変換時に問題を引き起こす可能性があります。

基本的な数値(両形式で同一):

{ "integer": 42, "negative": -17, "float": 3.14 }
integer: 42
negative: -17
float: 3.14

大きな整数と精度損失:

big_id: 9007199254740993
timestamp_ns: 1705312200000000000

JavaScriptの Number.MAX_SAFE_INTEGER9007199254740991 です。これを超える数値はJavaScript環境で解析時に精度が失われます。JSONとYAMLの両方がJavaScript環境でこの制限の影響を受けます。9007199254740993 という値は解析後に 9007199254740992 になる場合があります。

YAML固有の数値フォーマット(JSONでは使用不可):

# 8進数(YAML 1.1は0プレフィックス、YAML 1.2は0oプレフィックス)
file_perms_v1: 0755     # YAML 1.1: 10進数で493
file_perms_v2: 0o755    # YAML 1.2: 10進数で493

# 16進数
color: 0xFF5733          # 10進数で16734003

# Infinity と NaN(YAMLはサポート、JSONはサポートしない)
max_value: .inf
min_value: -.inf
undefined_result: .nan

JSONに変換すると:

{
  "file_perms_v1": 493,
  "file_perms_v2": 493,
  "color": 16734003,
  "max_value": null,
  "min_value": null,
  "undefined_result": null
}

重要な違い:

  • 8進数0755)はYAMLでは10進数の等価値に変換されてJSONに出力されます。文字列の "0755"(ファイルパーミッションなど)を意図している場合はクォートが必要です。
  • .inf.nan にはJSON等価物がありません。通常 null に変換されるか、コンバーターによってはエラーになります。
  • 数値内のアンダースコアはYAMLでは可読性のために許可(1_000_000)されますが、JSONでは使用できません。
  • 指数表記は両方で機能:1.5e10 はJSONでもYAMLでも有効です。

精度が重要な場合、両形式で大きな数値は文字列として格納しましょう:"9007199254740993"

ユースケース

Unixファイルパーミッションを8進数表記(0755、0644)で含む設定ファイルをYAMLとJSON間で変換する際に、数値が正しく解釈され破損しないようにする場合。

試してみる — JSON ↔ YAML Converter

フルツールを開く