【PHP8.x】JSON_PRESERVE_ZERO_FRACTION定数の使い方
JSON_PRESERVE_ZERO_FRACTION定数の使い方について、初心者にもわかりやすく解説します。
基本的な使い方
JSON_PRESERVE_ZERO_FRACTION定数は、PHPでデータをJSON形式に変換する際に、浮動小数点数の表現方法を制御するために使用される定数です。この定数は、json_encode()関数のオプションとして渡すことで利用できます。
通常、PHPでは1.0のような小数点以下が0の浮動小数点数をJSON形式に変換すると、その値は整数として表現されます。例えば、PHPの数値1.0はJSONでは1と出力されます。しかし、JSON_PRESERVE_ZERO_FRACTION定数を指定した場合、小数点以下が0であっても、元の浮動小数点数として正確に表現されるようになります。つまり、1.0はJSONでも1.0として出力されます。
この機能は、特にJSONデータを受け取る側のシステムが、数値のデータ型(整数か浮動小数点数か)を厳密に区別する必要がある場合に重要となります。例えば、JavaScriptなどのフロントエンドアプリケーションでは、1と1.0が異なる型として扱われ、特定の処理のトリガーとなることがあります。そのため、PHPからJSONデータを生成する際に、数値の型を意図した通りに保持したい場合に、この定数が非常に役立ちます。
JSON_PRESERVE_ZERO_FRACTION定数は、PHP 5.6.6以降のバージョンで利用可能です。
構文(syntax)
1json_encode($value, JSON_PRESERVE_ZERO_FRACTION);
引数(parameters)
引数なし
引数はありません
戻り値(return)
int
JSON_PRESERVE_ZERO_FRACTION は、JSON エンコード時に数値の小数部分のゼロを保持するための定数で、整数型 (int) の値を返します。
サンプルコード
JSON_PRESERVE_ZERO_FRACTION でゼロ分数を保持する
1<?php 2 3/** 4 * json_encodeにおけるJSON_PRESERVE_ZERO_FRACTIONオプションの動作を示すサンプルコード。 5 * このオプションは、浮動小数点数(例: 1.0)が整数に変換されるのを防ぎ、 6 * ゼロ分数(.0)を保持したままJSONにエンコードします。 7 */ 8function demonstrateJsonPreserveZeroFraction(): void 9{ 10 // 浮動小数点数を含むデータを準備 11 $data = [ 12 'integer_example' => 10, 13 'float_one_point_zero' => 1.0, 14 'float_zero_point_zero' => 0.0, 15 'regular_float' => 123.45, 16 ]; 17 18 echo "--- JSON_PRESERVE_ZERO_FRACTION オプションなし ---\n"; 19 // デフォルトの挙動では、1.0 や 0.0 は整数に変換される 20 $jsonWithoutOption = json_encode($data, JSON_PRETTY_PRINT); 21 echo $jsonWithoutOption . "\n\n"; 22 23 echo "--- JSON_PRESERVE_ZERO_FRACTION オプションあり ---\n"; 24 // このオプションを使用すると、1.0 は 1.0 のまま、0.0 は 0.0 のまま保持される 25 $jsonWithOption = json_encode($data, JSON_PRETTY_PRINT | JSON_PRESERVE_ZERO_FRACTION); 26 echo $jsonWithOption . "\n"; 27} 28 29// 関数を実行して結果を表示 30demonstrateJsonPreserveZeroFraction(); 31 32?>
PHPのJSON拡張機能に含まれるJSON_PRESERVE_ZERO_FRACTIONは、json_encode関数でPHPのデータをJSON形式に変換する際に利用する定数です。この定数自体は整数値を持ち、json_encode関数の第2引数にオプションとして渡すことで特定のエンコード挙動を制御します。
通常、json_encodeは、例えば1.0や0.0といった浮動小数点数であっても、その値が整数の場合はJSON上では整数型(1や0)としてエンコードしてしまいます。しかし、システムの要件によっては、これらのゼロ分数(小数点以下の.0)を持つ浮動小数点数を厳密に浮動小数点数としてJSONに保持したい場合があります。
サンプルコードでは、この定数の効果を具体的に示しています。まず、JSON_PRESERVE_ZERO_FRACTIONオプションなしでjson_encodeを実行すると、1.0や0.0はJSONでそれぞれ1や0として表現されます。これはデフォルトの挙動です。
次に、json_encode関数のオプションにJSON_PRESERVE_ZERO_FRACTIONを追加して実行すると、1.0は1.0のまま、0.0は0.0のまま、小数点以下のゼロ分数も保持された浮動小数点数としてJSONにエンコードされます。これにより、元のPHPデータにおける数値の型表現を、JSONでもより忠実に維持することが可能になります。特に、他のプログラミング言語やシステムとの間で数値データをやり取りする際に、型の不一致による問題を避けたい場合に非常に役立つオプションです。
JSON_PRESERVE_ZERO_FRACTIONオプションは、json_encodeで浮動小数点数をJSONに変換する際、1.0や0.0のようなゼロ分数の数値が、デフォルトでは整数に変換される挙動を防ぎます。このオプションを利用すると、1.0は1.0、0.0は0.0と、JSONでも浮動小数点数として保持されます。JSONデータを受け取るシステムが、数値のデータ型(整数型か浮動小数点数型か)を厳密に区別する必要がある場合に特に有用です。PHP 8以降で利用可能で、他のjson_encodeオプションと同様にビットOR演算子|で組み合わせて使用できます。意図しない型変換による互換性の問題を回避し、データの一貫性を確保するために理解しておきましょう。
PHPでJSONレスポンスの小数点以下ゼロを保持する
1<?php 2 3/** 4 * JSON_PRESERVE_ZERO_FRACTION オプションを使用してJSONレスポンスを生成します。 5 * このオプションは、浮動小数点数の小数部分がゼロの場合に、`.0` の表記を保持します。 6 * 例えば、PHPの浮動小数点数 `10.0` は通常 `10` とエンコードされますが、 7 * このオプションを使用すると `10.0` としてエンコードされます。 8 * 9 * @return void 10 */ 11function serveDataAsJsonWithPreservedZeroFraction(): void 12{ 13 // HTTPレスポンスのContent-Typeヘッダーを設定し、 14 // クライアントにJSON形式のデータであることを伝えます。 15 header('Content-Type: application/json'); 16 17 // JSONとして出力するデータを準備します。 18 // ここでは、小数点以下が0の浮動小数点数 `price` と `length` を含めます。 19 $data = [ 20 'productName' => 'スマートフォンX', 21 'price' => 999.0, // 小数点以下が0の浮動小数点数(例: 999.0 が "999.0" として出力される) 22 'weightKg' => 0.25, 23 'available' => true, 24 'dimensionsCm' => [ 25 'length' => 15.0, // 小数点以下が0の浮動小数点数(例: 15.0 が "15.0" として出力される) 26 'width' => 7.5, 27 'height' => 0.8 28 ], 29 'version' => 1.0 // 例: 1.0 が "1.0" として出力される 30 ]; 31 32 // データをJSON形式にエンコードします。 33 // JSON_PRESERVE_ZERO_FRACTION: 浮動小数点数の小数部分が0でも `.0` を保持します。 34 // JSON_PRETTY_PRINT: JSONを見やすく整形して出力します。 35 // JSON_UNESCAPED_UNICODE: 日本語などのマルチバイト文字をエスケープせずにそのまま出力します。 36 $jsonResponse = json_encode( 37 $data, 38 JSON_PRESERVE_ZERO_FRACTION | JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE 39 ); 40 41 // JSONエンコード中にエラーが発生したかチェックします。 42 if (json_last_error() !== JSON_ERROR_NONE) { 43 // エラーが発生した場合、HTTPステータスコード500を設定し、 44 // エラーメッセージを含むJSONを返します。 45 http_response_code(500); 46 echo json_encode(['error' => 'JSONエンコードに失敗しました: ' . json_last_error_msg()]); 47 return; 48 } 49 50 // 生成されたJSON文字列をHTTPレスポンスとして出力します。 51 echo $jsonResponse; 52} 53 54// 上記の関数を呼び出し、JSONレスポンスを生成・出力します。 55serveDataAsJsonWithPreservedZeroFraction();
PHP 8のJSON_PRESERVE_ZERO_FRACTIONは、JSONレスポンス生成時、小数部分がゼロの浮動小数点数について、.0表記を保持する定数です。json_encode関数にこの定数を指定すると、通常10とエンコードされる10.0のような数値を10.0として出力し、数値表現の一貫性維持に貢献します。
サンプルコードでは、header関数でHTTPレスポンスのContent-Typeをapplication/jsonに設定し、JSON形式のデータであることをクライアントに伝えています。その上で、999.0や15.0など.0形式の数値を含むデータを定義しています。json_encode関数では、このJSON_PRESERVE_ZERO_FRACTIONを、JSON_PRETTY_PRINT(JSONを見やすく整形)、JSON_UNESCAPED_UNICODE(日本語などのマルチバイト文字をそのまま出力)といった他のオプションと共に渡すことで、これらのオプションが適用されたJSON文字列が生成されます。エンコード中にエラーが発生していないかはjson_last_error()で確認され、エラーがあれば、エラーメッセージを返す仕組みが実装されています。この定数自体は引数を持たず、戻り値は整数型で、json_encode関数のオプションとして利用されます。
JSON_PRESERVE_ZERO_FRACTIONは、10.0のように小数点以下がゼロの浮動小数点数を厳密な形式でJSON出力したい場合に利用します。これはデータ形式に厳格な外部システムとの連携時に重要です。サンプルコードのようにContent-Type: application/jsonヘッダーでJSONであることを明示することは必須です。また、json_encode後のエラーチェックは、予期せぬデータによる問題を特定し、安定したAPIを提供するために不可欠です。常に実装する習慣をつけましょう。JSON_PRETTY_PRINTは可読性を高めますが、本番環境ではデータ量が増え、パフォーマンスに影響する可能性もあるため、利用目的を考慮することが大切です。