Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【PHP8.x】JSON_UNESCAPED_SLASHES定数の使い方

JSON_UNESCAPED_SLASHES定数の使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

JSON_UNESCAPED_SLASHES定数は、PHPのjson_encode()関数がJSON形式の文字列を生成する際に、スラッシュ(/)文字をエスケープせずにそのまま出力するための定数です。

通常、json_encode()関数はJSONの仕様に従い、特殊文字であるスラッシュを\/のようにバックスラッシュでエスケープします。これは、JSON文字列の整合性を保つためや、特定の環境下での誤解釈を防ぐために行われる挙動です。

しかし、ウェブサイトのURLパスやファイルパスのように、データ中にスラッシュが頻繁に含まれる場合、エスケープされた\/が多くなることで、生成されるJSON文字列の可読性が低下したり、わずかにファイルサイズが増加したりすることがあります。

JSON_UNESCAPED_SLASHES定数をjson_encode()関数のオプションとして指定することで、このスラッシュのエスケープを抑制し、/として直接出力させることができます。これにより、生成されるJSON文字列はよりシンプルで分かりやすくなり、元のデータ構造に近い形でJSONを利用したい場合に役立ちます。この定数を使用しても、ダブルクォートやバックスラッシュといった他の重要な特殊文字は適切にエスケープされますので、JSONとしての有効性は損なわれません。

構文(syntax)

1<?php
2$data = ['path' => 'http://example.com/data/item'];
3$jsonEncodedString = json_encode($data, JSON_UNESCAPED_SLASHES);
4echo $jsonEncodedString;
5?>

引数(parameters)

引数なし

引数はありません

戻り値(return)

int

JSON_UNESCAPED_SLASHES は、JSON エンコード時にスラッシュ (/) をエスケープしないように指示するための定数です。この定数は整数値として定義されており、主に json_encode() 関数で使用されます。

サンプルコード

PHPのJSON_UNESCAPED_SLASHESでスラッシュをエスケープしない

1<?php
2
3/**
4 * JSON_UNESCAPED_SLASHES 定数を使用して、スラッシュがエスケープされないJSON文字列を生成するサンプル。
5 *
6 * この定数はjson_encode関数のオプションとして使用され、通常エスケープされるスラッシュ (/) を
7 * エスケープせずにそのまま出力するために利用されます。
8 * システムエンジニアを目指す初心者の方にも分かりやすいように、その動作を比較して示します。
9 */
10
11// サンプルデータ: スラッシュを含む文字列を持つ配列
12$data = [
13    'name' => 'Sample Product',
14    'url' => 'https://example.com/api/v1/resource',
15    'path' => '/users/john_doe',
16];
17
18echo "--- 通常のjson_encode (スラッシュがエスケープされる場合) ---\n";
19// JSON_UNESCAPED_SLASHES を指定しない場合
20// スラッシュ (/) は "\/" のようにエスケープされます。
21$defaultEncodedJson = json_encode($data, JSON_PRETTY_PRINT);
22echo $defaultEncodedJson . "\n\n";
23
24echo "--- JSON_UNESCAPED_SLASHES を使用した場合 (スラッシュがエスケープされない場合) ---\n";
25// JSON_UNESCAPED_SLASHES を指定した場合
26// スラッシュ (/) はエスケープされず、そのまま出力されます。
27// 可読性が向上したり、特定のAPI要件に合わせるために使用されます。
28$unescapedSlashEncodedJson = json_encode($data, JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT);
29echo $unescapedSlashEncodedJson . "\n\n";
30
31// 結果の比較
32echo "--- 違いの比較 ---\n";
33echo "デフォルト:\n" . $defaultEncodedJson . "\n\n";
34echo "UNESCAPED_SLASHES:\n" . $unescapedSlashEncodedJson . "\n\n";
35echo "ご覧のように、JSON_UNESCAPED_SLASHES を使用すると、URLやパス内のスラッシュが\n";
36echo "エスケープされずに、より自然な形式で表示されていることがわかります。\n";
37
38?>

PHP 8で利用できるJSON_UNESCAPED_SLASHESは、JSON形式の文字列を生成する際にjson_encode関数で指定するオプション定数です。この定数自体は引数を取らず、戻り値は整数値として定義されています。

通常、json_encode関数でデータをJSONに変換すると、スラッシュ記号(/)は\/のようにエスケープされて出力されます。しかし、JSON_UNESCAPED_SLASHES定数をjson_encode関数の第2引数に渡すことで、このエスケープ処理を無効にし、スラッシュをそのままの形で出力させることができます。

サンプルコードでは、スラッシュを含むURLやパスを持つデータをJSONに変換する例を示しています。まず、JSON_UNESCAPED_SLASHESを指定しない場合は、スラッシュがエスケープされたJSON文字列が生成されます。一方、この定数を指定すると、スラッシュがエスケープされずに、より自然な形式でJSON文字列が出力されていることがわかります。

このオプションは、生成されるJSONの可読性を高めたい場合や、通信先のAPIがエスケープされていないスラッシュを要求する場合などに役立ちます。JSONの出力形式を細かく制御するための便利な機能です。

JSON_UNESCAPED_SLASHES定数は、JSON文字列を生成するjson_encode関数にのみ使用し、json_decode関数では効果がない点にご注意ください。

PHPのjson_encodeは、デフォルトでスラッシュを\/のようにエスケープしますが、これはJSONの仕様上推奨される形式の一つです。JSON_UNESCAPED_SLASHESを指定すると、スラッシュがエスケープされずにそのまま出力されます。これにより、生成されるJSONの可読性が向上したり、特定のエスケープされていないスラッシュを期待する外部APIとの連携がスムーズになります。

複数のオプションを組み合わせる場合は、サンプルコードのように|(ビットOR)演算子を使用してください。この定数の使用が直接的なセキュリティリスクを高めるわけではありませんが、出力されるJSONの形式が変更されることを理解し、必要に応じて適用することが重要です。

PHP JSON_UNESCAPED_SLASHES でスラッシュをエスケープしない

1<?php
2
3/**
4 * JSON_UNESCAPED_SLASHES 定数の使用例を示すスクリプト。
5 * この定数は、json_encode() 関数でスラッシュ('/')をエスケープしないように指定します。
6 * 通常、JSON ではスラッシュは '\/' のようにエスケープされますが、
7 * このフラグを使用すると、エスケープされずにそのまま出力されます。
8 */
9
10// サンプルデータを用意します。URLのようにスラッシュを含む文字列を含めます。
11$data = [
12    'productName' => 'PHP開発ガイド',
13    'version' => 8,
14    'downloadUrl' => 'https://example.com/downloads/php-guide/v8.pdf',
15    'categoryPath' => '/programming/languages/php'
16];
17
18echo "--- JSON_UNESCAPED_SLASHES を使用しない場合 ---" . PHP_EOL;
19// JSON_UNESCAPED_SLASHES フラグなしでデータをJSON形式にエンコードします。
20// JSON_PRETTY_PRINT は出力を見やすくするためのオプションです。
21// この場合、スラッシュ (/) が '\/' とエスケープされます。
22$jsonWithoutUnescapedSlashes = json_encode($data, JSON_PRETTY_PRINT);
23
24if ($jsonWithoutUnescapedSlashes === false) {
25    echo "エラー: JSON エンコードに失敗しました。" . PHP_EOL;
26} else {
27    echo $jsonWithoutUnescapedSlashes . PHP_EOL;
28}
29
30echo PHP_EOL; // 出力を見やすくするための空行
31
32echo "--- JSON_UNESCAPED_SLASHES を使用する場合 ---" . PHP_EOL;
33// JSON_UNESCAPED_SLASHES フラグを使用してデータをJSON形式にエンコードします。
34// 他のフラグ (例: JSON_PRETTY_PRINT) と組み合わせる場合は、ビットOR演算子 (|) を使用します。
35// この場合、スラッシュ (/) がエスケープされず、そのまま表示されます。
36$jsonWithUnescapedSlashes = json_encode($data, JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT);
37
38if ($jsonWithUnescapedSlashes === false) {
39    echo "エラー: JSON エンコードに失敗しました。" . PHP_EOL;
40} else {
41    echo $jsonWithUnescapedSlashes . PHP_EOL;
42}
43
44?>

JSON_UNESCAPED_SLASHESは、PHP 8から提供されている拡張機能(extension)の定数の一つです。この定数自体に引数はなく、その値は整数型(int)です。主にjson_encode()関数と組み合わせて使用され、配列などのPHPのデータをJSON形式の文字列に変換する際の、スラッシュ(/)のエスケープ挙動を制御する役割を持っています。

通常、json_encode()関数はJSON文字列内のスラッシュを\/のようにエスケープして出力します。これは、一部の環境でJSONがHTML内に埋め込まれた際などに意図しない解釈を防ぐためです。しかし、このJSON_UNESCAPED_SLASHES定数をjson_encode()関数の第2引数に指定することで、スラッシュはエスケープされずに、元の/の形でそのまま出力されます。

サンプルコードでは、まずこの定数を使用しない場合のJSON出力例を示しており、downloadUrlcategoryPathに含まれるスラッシュが\/とエスケープされて表示されることが確認できます。次に、JSON_UNESCAPED_SLASHES定数をJSON_PRETTY_PRINTなどの他のフラグと組み合わせて使用した場合の例が示されています。複数のフラグを同時に指定する際には、ビットOR演算子(|)を使用します。この指定により、スラッシュがエスケープされずに、元の/のまま表示されることがわかります。この定数は、JSONデータを外部システムに送信する際など、特定のスラッシュのエスケープが不要または望ましくない場合に非常に便利です。

json_encode関数で複数のフラグを指定する際には、ビットOR演算子である|を使用することに注意してください。この関数は、エンコードに失敗した場合にfalseを返しますので、必ずその戻り値をチェックし、適切にエラー処理を行うことが重要です。JSON_UNESCAPED_SLASHESはスラッシュのエスケープを解除し、JSONの可読性を高める効果がありますが、JSONデータをHTMLに直接埋め込むようなケースでは、クロスサイトスクリプティング(XSS)などのセキュリティリスクを生む可能性がゼロではありません。そのため、この定数を利用する際は、その用途と出力先を十分に検討し、セキュリティに配慮した実装を心がけるようにしてください。主にAPIレスポンスやログ出力など、特定の用途で利用されます。

関連コンテンツ