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_INTEGER は 9007199254740991 です。これを超える数値は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間で変換する際に、数値が正しく解釈され破損しないようにする場合。