【PHP8.x】JSON_UNESCAPED_LINE_TERMINATORS定数の使い方
JSON_UNESCAPED_LINE_TERMINATORS定数の使い方について、初心者にもわかりやすく解説します。
基本的な使い方
JSON_UNESCAPED_LINE_TERMINATORS定数は、PHPのjson_encode関数が値をJSON形式の文字列に変換する際の、改行文字の扱われ方を制御するための定数です。
通常、JSON文字列では、改行文字(例えば、\nや\r)は特殊文字として認識され、JSONの仕様に従って\\nや\\rのようにエスケープされます。これは、JSONデータの安全な転送と解析を保証するためです。しかし、このJSON_UNESCAPED_LINE_TERMINATORS定数をjson_encode関数の第二引数であるオプションとして指定すると、これらの改行文字はエスケープされることなく、元のままの形式でJSON文字列に含まれるようになります。
この機能は、出力されるJSON文字列の可読性を高めたい場合や、特定のシステムやツールがエスケープされていない改行文字を要求する場合に有用です。例えば、デバッグ時や、改行がそのままの形で表示されることを期待するログ出力などで役立つことがあります。
ただし、JSONの標準的な仕様では改行文字のエスケープが推奨されているため、この定数を使用する際は、生成されたJSONを処理するシステムがエスケープされていない改行文字を正しく扱えることを確認することが重要です。互換性やセキュリティの面で問題が発生しないよう、その影響を十分に理解した上で利用してください。
構文(syntax)
1<?php 2$data = "Line one\nLine two"; 3$json = json_encode($data, JSON_UNESCAPED_LINE_TERMINATORS); 4echo $json; 5?>
引数(parameters)
引数なし
引数はありません
戻り値(return)
int
JSON_UNESCAPED_LINE_TERMINATORSは、json_encode()関数で使用される定数です。この定数を指定すると、JSON文字列内で改行文字(LFやCR)がエスケープされずにそのまま出力されるようになります。
サンプルコード
PHP: json_encode でスラッシュ・改行をエスケープ解除する
1<?php 2 3/** 4 * PHPのjson_encode関数におけるJSON_UNESCAPED_LINE_TERMINATORS 5 * および JSON_UNESCAPED_SLASHES オプションの使用例を示します。 6 * 7 * これらのオプションは、JSON出力内の特定文字のエスケープ挙動を制御します。 8 */ 9function demonstrateJsonUnescapedOptions(): void 10{ 11 // JSON変換するサンプルデータを用意 12 $data = [ 13 'path' => 'https://example.com/api/data', 14 'message' => "これは\n複数行に\r\nわたるテキストです。", 15 'category' => 'テスト/カテゴリ', 16 ]; 17 18 echo "--- デフォルトのエスケープ(オプションなし)---\n"; 19 // デフォルトではスラッシュと改行文字はエスケープされます。 20 // 例: '/' は '\/'、'\n' は '\\n' になります。 21 $defaultJson = json_encode($data); 22 echo $defaultJson . "\n\n"; 23 24 echo "--- JSON_UNESCAPED_SLASHES の使用 ---\n"; 25 // JSON_UNESCAPED_SLASHES オプションは、スラッシュ '/' のエスケープを解除します。 26 // URLなど、スラッシュが頻繁に使われる場面でJSONをより読みやすくします。 27 $unescapedSlashesJson = json_encode($data, JSON_UNESCAPED_SLASHES); 28 echo $unescapedSlashesJson . "\n\n"; 29 30 echo "--- JSON_UNESCAPED_LINE_TERMINATORS の使用 ---\n"; 31 // JSON_UNESCAPED_LINE_TERMINATORS オプションは、改行文字(\n, \r)のエスケープを解除します。 32 // テキストフィールドなどに改行が含まれる場合、そのままの改行として出力されます。 33 $unescapedLineTerminatorsJson = json_encode($data, JSON_UNESCAPED_LINE_TERMINATORS); 34 echo $unescapedLineTerminatorsJson . "\n\n"; 35 36 echo "--- 両方のオプションを組み合わせて使用 ---\n"; 37 // 複数のオプションを同時に使用するには、ビット演算子のOR (|) を使って組み合わせます。 38 // この例では、スラッシュと改行文字の両方のエスケープが解除されます。 39 $combinedUnescapedJson = json_encode($data, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_LINE_TERMINATORS); 40 echo $combinedUnescapedJson . "\n"; 41} 42 43// 関数を実行して結果を表示 44demonstrateJsonUnescapedOptions();
PHPのJSON_UNESCAPED_LINE_TERMINATORSは、json_encode関数でデータをJSON形式に変換する際に、出力されるJSON文字列の特定の文字エスケープ挙動を制御するための定数オプションです。この定数自体は引数を取らず、内部的に整数値(int)として機能します。
通常、json_encode関数は、JSONの仕様に従い、スラッシュ(/)や改行文字(\n, \r)などの特殊文字を自動的にエスケープします。例えば、スラッシュは\/に、改行は\\nのように変換されます。これはJSONの互換性を保つために重要ですが、生成されるJSON文字列が読みにくくなる場合があります。
サンプルコードは、このエスケープ挙動を制御する例を示しています。まず、オプションなしのデフォルトでは、スラッシュと改行文字がエスケープされた状態で出力されることがわかります。
次に、JSON_UNESCAPED_SLASHESオプションを使用すると、URLパスなどに含まれるスラッシュが\/のようにエスケープされず、そのまま/として出力されます。これにより、JSON内のURLなどがより自然な形で表示され、可読性が向上します。
さらに、本定数であるJSON_UNESCAPED_LINE_TERMINATORSオプションを適用すると、文字列データに含まれる改行文字(\n, \r)のエスケープが解除されます。結果として、JSON出力内でこれらの改行文字がそのまま維持され、特に複数行のテキストデータをJSONに含める場合に便利です。
複数のオプションを同時に適用したい場合は、ビットOR演算子|を使って、JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_LINE_TERMINATORSのように組み合わせることができます。これにより、スラッシュと改行文字の両方のエスケープを一度に解除できます。
これらのオプションは、生成されるJSONの可読性を高め、特定の連携システムでエスケープされていない形式が求められる場合に役立ちます。
PHPのjson_encode関数でJSON_UNESCAPED_LINE_TERMINATORSやJSON_UNESCAPED_SLASHESを使用する際は、JSON出力が読みやすくなる反面、いくつかの注意点があります。
JSON_UNESCAPED_LINE_TERMINATORSを使うと、JSON文字列内に直接改行文字が含まれるため、これをログに記録したり、特定のパーサーで処理したりする際に、表示崩れや予期せぬエラーの原因となる可能性があります。利用するシステムの特性を理解し、影響がないか確認することが重要です。
JSON_UNESCAPED_SLASHESはURLなどのスラッシュを見やすくしますが、どちらのオプションも、JSONを消費する側のシステムがエスケープされていない文字を問題なく扱えるか事前に確認してください。
複数のオプションを同時に指定する場合は、サンプルコードのようにビット演算子のOR (|) を用いて組み合わせます。これらのオプションは、JSONの可読性を高める目的で利用しますが、JSON標準の厳密な要件や、連携するシステムとの互換性を考慮した上で慎重に適用してください。
PHP json_encode で改行をエスケープしない
1<?php 2 3/** 4 * PHPのJSONエンコードオプション `JSON_UNESCAPED_LINE_TERMINATORS` の使用例。 5 * 6 * この定数は、JSON文字列内の改行文字 (例: \n, \r) をエスケープせずに 7 * そのまま出力するために使用されます。PHP 8.1以降で利用可能です。 8 * 9 * `JSON_UNESCAPED_SLASHES` オプションと組み合わせることで、 10 * スラッシュ (/) もエスケープされないように設定できます。 11 */ 12 13// サンプルデータを用意します。改行文字とスラッシュを含んでいます。 14$data = [ 15 'title' => "ドキュメントタイトル\n次行へ", 16 'url' => 'https://example.com/path/to/resource', 17 'description' => "これは/を含む文字列です。" 18]; 19 20echo "--- 1. デフォルトのjson_encodeの動作 ---\n"; 21// デフォルトでは、改行文字 (\n) とスラッシュ (/) はエスケープされます。 22$jsonDefault = json_encode($data, JSON_PRETTY_PRINT); 23echo "【デフォルト】:\n" . $jsonDefault . "\n\n"; 24 25echo "--- 2. JSON_UNESCAPED_LINE_TERMINATORS の使用 ---\n"; 26// `JSON_UNESCAPED_LINE_TERMINATORS` を使用すると、改行文字 (\n) はエスケープされません。 27// スラッシュ (/) はデフォルトの動作(エスケープされる)のままです。 28$jsonUnescapedLineTerminators = json_encode($data, JSON_UNESCAPED_LINE_TERMINATORS | JSON_PRETTY_PRINT); 29echo "【JSON_UNESCAPED_LINE_TERMINATORS】:\n" . $jsonUnescapedLineTerminators . "\n\n"; 30 31echo "--- 3. JSON_UNESCAPED_SLASHES と JSON_UNESCAPED_LINE_TERMINATORS の併用 ---\n"; 32// `JSON_UNESCAPED_SLASHES` と `JSON_UNESCAPED_LINE_TERMINATORS` を併用すると、 33// スラッシュ (/) と改行文字 (\n) の両方がエスケープされなくなります。 34// 複数のオプションはビットOR演算子 (|) で結合します。 35$jsonUnescapedBoth = json_encode($data, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_LINE_TERMINATORS | JSON_PRETTY_PRINT); 36echo "【JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_LINE_TERMINATORS】:\n" . $jsonUnescapedBoth . "\n"; 37
PHPのJSON_UNESCAPED_LINE_TERMINATORSは、json_encode関数でPHPのデータをJSON形式に変換する際に、文字列中の改行文字の扱いを制御するための定数です。この定数自体は引数を取らず、整数値(int)としてjson_encode関数のオプションとして利用されます。
通常、json_encode関数はJSONの標準仕様に基づき、文字列中の改行文字(例えば\nや\r)を\\nや\\rのようにエスケープして出力します。しかし、JSON_UNESCAPED_LINE_TERMINATORSをjson_encode関数の第二引数に指定すると、これらの改行文字がエスケープされずに、そのままの形でJSON文字列に含まれるようになります。これにより、生成されるJSONの可読性が向上したり、特定のシステムとの連携がスムーズになったりする場合があります。この機能はPHP 8.1以降で利用可能です。
サンプルコードでは、まずデフォルトのjson_encodeの動作として、改行文字とスラッシュがエスケープされる例が示されています。次に、JSON_UNESCAPED_LINE_TERMINATORSを指定することで、改行文字のみがエスケープされなくなることがわかります。さらに、JSON_UNESCAPED_SLASHESオプションと組み合わせると、スラッシュ(/)もエスケープせずにそのまま出力できます。複数のオプションを同時に指定したい場合は、ビットOR演算子|を使って結合することで実現できます。
PHPのJSON_UNESCAPED_LINE_TERMINATORS定数は、PHP 8.1以降で導入されました。この定数を使うと、JSON文字列内の改行文字がエスケープされずに出力されます。JSONの可読性を高めたい場合や、特定のシステムとの連携で改行文字をそのまま扱う必要がある場合に有効です。
しかし、エスケープを解除することで、JSONを受け取る側のシステムがその改行を適切に処理できるかを確認する必要があります。特にWebブラウザでJSONデータを直接表示するようなケースでは、意図しない表示の崩れや、クロスサイトスクリプティング(XSS)といったセキュリティリスクを招く可能性もゼロではありません。そのため、このオプションの利用は、その必要性を十分に検討し、安全性を確認した上で慎重に行うことが重要です。複数のJSONエンコードオプションを適用する際は、サンプルコードのように|(ビットOR演算子)で結合して指定します。