【PHP8.x】json_encode関数の使い方

作成日: 更新日:

json_encode関数は、PHPの値をJSON形式の文字列にエンコードする関数です。この関数は、配列やオブジェクトなどのPHPのデータ構造を、JavaScript Object Notation(JSON)というデータ交換形式に変換するために使用されます。JSONは、ウェブアプリケーションでデータを送受信する際によく利用される軽量な形式であり、異なるプログラミング言語間でのデータのやり取りを容易にします。

json_encode関数は、エンコードするPHPの値を必須の引数として受け取り、オプションでいくつかのフラグを指定することで、エンコードの挙動を細かく制御できます。例えば、JSON_PRETTY_PRINTフラグを使用すると、生成されるJSON文字列が見やすく整形されます。また、JSON_UNESCAPED_UNICODEフラグを使用すると、Unicode文字がエスケープされずにそのままJSON文字列に含まれます。

この関数は、エラーが発生した場合(例えば、エンコードできない値が渡された場合)には、FALSEを返します。成功した場合は、JSON形式の文字列を返します。システムエンジニアがウェブAPIを開発したり、データをJSON形式で保存したりする際に、この関数は非常に役立ちます。正確なJSON文字列を生成することで、異なるシステム間でのデータ連携をスムーズに行うことが可能になります。

基本的な使い方

構文(syntax)

json_encode(mixed $value, int $flags = 0, int $depth = 512): string|false

引数(parameters)

mixed $value, int $flags = 0, int $depth = 512

  • mixed $value: JSON にエンコードしたい値。文字列、数値、配列、オブジェクト、NULL など、PHP の様々なデータ型を指定できます。
  • int $flags = 0: エンコードの動作を制御するためのオプションフラグ。デフォルトは 0 で、特別なフラグは指定されません。
  • int $depth = 512: エンコードする値の最大ネスト深度。デフォルトは 512 です。

戻り値(return)

string|false

与えられたPHPの値をJSON形式の文字列にエンコードした結果、またはエンコードに失敗した場合はfalseを返します。

サンプルコード

PHPでjson_encodeによるエスケープ処理

<?php

// 連想配列をJSON形式の文字列に変換する
$data = [
    "name" => "太郎",
    "age" => 30,
    "city" => "東京",
    "comment" => "特殊文字: \"<>&'が含まれています。" // エスケープが必要な文字
];

// JSON_UNESCAPED_UNICODE: 日本語をエスケープしない
// JSON_HEX_TAG: < と > をエスケープする
// JSON_HEX_AMP: & をエスケープする
// JSON_HEX_APOS: ' をエスケープする
// JSON_HEX_QUOT: " をエスケープする
$options = JSON_UNESCAPED_UNICODE | JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOT;

$json_string = json_encode($data, $options);

// エラー処理
if ($json_string === false) {
    echo "JSON エンコードエラー: " . json_last_error_msg() . PHP_EOL;
} else {
    echo $json_string . PHP_EOL;
    // 出力例: {"name":"太郎","age":30,"city":"東京","comment":"特殊文字: &quot;&lt;&gt;&amp;&apos;が含まれています。"}
}

?>

PHP 8.4のjson_encode関数は、PHPの変数をJSON形式の文字列に変換するために使用します。第一引数$valueには、JSONに変換したい配列やオブジェクトなどの値を指定します。第二引数$flagsはオプションで、JSONのエンコード方法を制御するフラグを指定します。例えば、JSON_UNESCAPED_UNICODEを指定すると、日本語がUTF-8のままエンコードされ、エスケープされません。JSON_HEX_TAG, JSON_HEX_AMP, JSON_HEX_APOS, JSON_HEX_QUOTなどのフラグを使用すると、それぞれ<&'"といったHTMLで特殊な意味を持つ文字をエスケープできます。第三引数$depthもオプションで、エンコードする配列やオブジェクトの深さの最大値を指定します。

このサンプルコードでは、連想配列 $data をJSON形式の文字列に変換しています。$options変数に複数のフラグをまとめて指定することで、日本語のUTF-8エンコードと、HTML特殊文字のエスケープを同時に行っています。

json_encode関数は、成功した場合にJSON文字列を返し、エラーが発生した場合はfalseを返します。そのため、戻り値がfalseかどうかをチェックし、エラーが発生した場合はjson_last_error_msg()関数でエラーメッセージを取得して表示するエラー処理を行うことが推奨されます。サンプルコードでは、エラーが発生した場合のエラーメッセージ出力と、成功した場合のJSON文字列出力の両方を実装しています。

json_encode関数は、PHPのデータをJSON形式の文字列に変換する際に非常に便利です。しかし、いくつか注意点があります。まず、日本語などのマルチバイト文字を扱う場合はJSON_UNESCAPED_UNICODEフラグを指定しないと、文字化けする可能性があります。次に、HTMLタグや特殊文字(", <, >, &, ')を含む文字列をJSONに含める場合、JSON_HEX_TAGJSON_HEX_AMPJSON_HEX_APOSJSON_HEX_QUOTなどのフラグを使ってエスケープ処理を行うことで、セキュリティリスクを軽減できます。json_encodefalseを返す場合、json_last_error_msg()関数でエラー内容を確認するようにしましょう。第三引数の$depthは、配列やオブジェクトのネストの深さを指定するもので、デフォルトは512です。ネストが深いデータを扱う際は、必要に応じて調整してください。

PHPで日本語をJSONエンコードする

<?php

// 日本語を含む配列をJSON形式にエンコードするサンプル
$data = [
    "name" => "山田太郎",
    "age" => 30,
    "city" => "東京都"
];

// JSON_UNESCAPED_UNICODE フラグを指定して、日本語がUTF-8で出力されるようにする
$json = json_encode($data, JSON_UNESCAPED_UNICODE);

// エンコード結果をチェック
if ($json === false) {
    // エラー処理
    echo "JSONエンコードに失敗しました。\n";
} else {
    // エンコードされたJSONを出力
    echo $json . "\n";
}

?>

PHP 8.4のjson_encode関数は、PHPの変数をJSON形式の文字列に変換するために使用します。この関数はextensionfunctionに分類されます。

サンプルコードでは、日本語を含む連想配列 $data をJSON形式にエンコードしています。json_encode関数の第一引数 $value にはエンコードしたい変数を指定します。第二引数 $flags はオプションで、エンコード時の動作を制御するフラグを指定します。ここでは、JSON_UNESCAPED_UNICODE フラグを指定することで、日本語がUnicodeエスケープされずにUTF-8のままJSONに出力されるようにしています。第三引数 $depth は、エンコードする配列やオブジェクトの深さの最大値を指定します。デフォルト値は512です。

json_encode関数の戻り値は、エンコードされたJSON文字列です。エンコードに失敗した場合は false を返します。サンプルコードでは、戻り値が false かどうかをチェックし、エラーが発生した場合はエラーメッセージを表示、成功した場合はエンコードされたJSON文字列を出力しています。この関数を使うことで、PHPのデータをWeb APIなどで利用しやすいJSON形式に簡単に変換できます。

json_encode関数で日本語を扱う場合、JSON_UNESCAPED_UNICODEフラグを指定することが重要です。このフラグがないと、日本語がUnicodeエスケープされてしまい、可読性が損なわれます。エンコード結果がfalseの場合、エラーが発生しているため、適切にエラーハンドリングを行いましょう。json_encodeは複雑なデータ構造も扱えますが、循環参照があるとエンコードに失敗します。depth引数で再帰の深さを調整できますが、通常はデフォルト値で問題ありません。サーバーの文字コード設定も確認し、UTF-8であることを推奨します。

【PHP8.x】json_encode関数の使い方 | いっしー@Webエンジニア