PHP の json_encode() および json_decode() を理解する

2025年10月14日

JSON (JavaScript Object Notation) は、その軽量で人間が読めるフォーマットと、プログラミング言語間の互換性により、最近のウェブ開発におけるデータ交換のデファクトスタンダードとなっています。PHPでは、2つの組み込み関数json_encode() そして json_decode()-これらの関数は、PHP のデータ構造を JSON 文字列に変換したり、逆に PHP のデータ構造を JSON 文字列に変換したりすることができます。これらの関数を使うことで、開発者は PHP のデータ構造を JSON 文字列に変換したり、逆に JSON 文字列を PHP のデータ構造に変換したりすることができます。この記事では PHP json_encode() およびPHP json_decode(), その構文、オプション、使用例、エラー処理、ベストプラクティスを探る。.

どのようなものなのか? json_encode() そして json_decode()?

json_encode() 関数は、PHP 変数 (配列やオブジェクトなど) を JSON 形式の文字列に変換します。逆に, json_decode() は JSON 文字列を受け取り、それを PHP の変数 (通常は配列やオブジェクト) に変換します。これらの関数は、API開発、データストレージ、PHPバックエンドとJavaScriptフロントエンド間の通信などのタスクに不可欠です。.

なぜJSONなのか?

JSONはテキストベースのフォーマットで、人間にとっては読み書きが簡単で、機械にとっては解析や生成が簡単です。その主な利点は以下の通りです:

  • 言語にとらわれない:ほぼすべてのプログラミング言語でサポート.
  • 軽量:XMLに比べてペイロードが小さい。.
  • ストラクチャード:配列やオブジェクトのような複雑なデータ構造を標準化された方法で表現。.

PHP の JSON 関数は、PHP のネイティブなデータ型と JSON のギャップを埋めるものであり、 モダンなウェブアプリケーションには欠かせないものです。.

PHPの探求 json_encode()

json_encode() 関数は、PHP の値を JSON 文字列に変換します。基本構文は次のとおりです:

php
文字列 json_encode(mixed $value, int $flags = 0, int $depth = 512)
  • $value:エンコードする PHP の値 (配列、オブジェクト、文字列、数値、ブーリアン、null など)。.
  • $フラグ:エンコーディングの動作を変更するためのオプションのビットマスク(例、, json_pretty_print, json_force_object).
  • $深度:エンコードの最大入れ子深さ(デフォルトは512)。.

PHPの仕組み json_encode() 作品

PHP 変数を json_encode(), そして、データをJSON文字列にシリアライズする。例えば

php
$data = [
    'name' => 'Alice'、
    'age' => 30、
    'is_student' => false
];
$json = json_encode($data);
echo $json;;

出力:

json
{"name":"Alice","age":30,"is_student":false}

この出力は、PHP の連想配列を表すコンパクトな JSON 文字列です。.

一般的なPHP json_encode() オプション

$フラグ パラメータを使うと、 エンコード処理をカスタマイズできます。よく使われるフラグには以下のようなものがある:

  • json_pretty_print:JSON出力を読みやすいようにインデントと改行で整形します。.
  • json_force_object:配列(インデックス付きであっても)を強制的にJSONオブジェクトとしてエンコードする。.
  • json_numeric_check:JSON出力の数値文字列を数値に変換する。.
  • json_unescaped_slashes:スラッシュ(/)のエスケープを防ぐ。.
  • json_unescaped_unicode:ユニコード文字をエスケープシーケンスとしてではなく、文字通りにエンコードする(例えば、“\(英語)”がéになる)。.

json_pretty_print:

php
$data = ['name' => 'Bob', 'age' => 25];
$json = json_encode($data, JSON_PRETTY_PRINT);
echo $json;;

出力:

json
{
    "name":"ボブ"、
    "age":25
}

複雑なデータを扱う

json_encode() はネストした配列やオブジェクトを扱うことができる。例えば

php
$data = [
    'user' => [
        'name' => 'Charlie'、
        'details' => [
            'email' => '[email protected]'、
            'active' => true
        ]
    ],
    'scores' => [95, 88, 92].
];
echo json_encode($data, JSON_PRETTY_PRINT);;

出力:

json
{
    "user":{
        "name":"チャーリー"、
        "details":{
            "email":"[email protected]"、
            "active": true
        }
    },
    "スコア":[95, 88, 92]
}

限界とエラー

json_encode() を返して失敗することがある。 擬似 とエラーコードを設定します。よくある問題は以下の通り:

  • 無効なUTF-8文字:JSONには有効なUTF-8エンコーディングが必要です。UTF-8でない文字列はエンコードに失敗します。.
  • 過度の深さ:データ構造が $深度 limit (デフォルトは512) を超えるとエンコードに失敗する。.
  • サポートされていないタイプ:リソース(ファイルハンドルなど)はエンコードできない。.

デバッグするには json_last_error() そして json_last_error_msg():

php
$data = ["name" => "\xB1x31"]; // 無効なUTF-8
$json = json_encode($data);
if ($json === false) { // UTF-8 が無効です。
    echo "エラー:" . json_last_error_msg();
}

出力:

エラー:UTF-8文字が不正にエンコードされている可能性があります。

PHPのベストプラクティス json_encode()

  1. 入力データの検証:を使用して文字列がUTF-8エンコードされていることを確認します。 utf8_encode() または mb_convert_encoding() 必要なら.
  2. 適切なフラグを使用する:次のような旗を選ぶ。 json_pretty_print デバッグ用 数値データ用のJSON_NUMERIC_CHECK/code>。.
  3. エラー処理:常に戻り値をチェックし json_last_error() 問題を診断する。.
  4. 深さに注意:深いネスト構造では $深度 パラメータは、スタック・オーバーフローを避けるために慎重に使用すること。.

PHPの探求 json_decode()

json_decode() 関数は、JSON 文字列を PHP 変数に変換します。構文は次のとおりです:

php

mixed json_decode(string $json, bool $assoc = false, int $depth = 512, int $flags = 0)

  • $json:デコードするJSON文字列。.
  • 1TP4タソック:trueの場合、JSONオブジェクトに対してオブジェクトの代わりに連想配列を返す。.
  • $深度:デコードの最大入れ子深さ(デフォルト512)。.
  • $フラグ:デコード動作を変更するためのオプションのフラグ。.

PHPの仕組み json_decode() 作品

デフォルトでは, json_decode() JSONオブジェクトをPHPに変換する 標準クラス オブジェクトになります。例えば

php
$json = '{"name": "David", "age":40}';
$data = json_decode($json);
echo $data->name; // オブジェクトとしてアクセスする

出力:

デビッド

もし $assoc = true, JSONオブジェクトは連想配列に変換される:

php
$data = json_decode($json, true);
echo $data['name']; // 配列としてアクセスする

出力:

デビッド

複雑なJSONのデコード

json_decode() はネストした構造をシームレスに処理する:

php
$json = '{」です。
    "user":{
        "name":"Eve"、
        "details":{
            "email":"[email protected]"、
            「アクティブ": true
        }
    },
    "スコア":[85, 90, 88]
}";
$data = json_decode($json, true);
echo $data['user']['details']['email'];;

出力:

[email protected]

一般的なPHP json_decode() オプション

$フラグ パラメータは以下のようなオプションをサポートしている:

  • json_bigint_as_string:精度の低下を避けるため、大きな整数を文字列として扱う。.
  • json_throw_on_error:をスローする。 JsonException を返す代わりに、エラー時に ヌル.

json_throw_on_error:

php
$json = '{"名前": "フランク", "年齢":}'; // 無効なJSON
トライ
$data = json_decode($json, false, 512, JSON_THROW_ON_ERROR);
} catch (JsonException $e) { { JSON_THROW_ON_ERROR.
echo "エラー:" .$e->getMessage();
}

出力:

エラー構文エラー

エラー処理

好き json_encode(), json_decode() を返して失敗することがある。 ヌル ない限り json_throw_on_error が使われている。よくあるエラーは以下の通り:

  • 構文エラー:JSONが不正です(カンマや中括弧がないなど)。.
  • 深さ超過:JSON構造が $深度
  • 無効なJSON:非JSON入力。.

用途 json_last_error() を診断する:

php
$json = '{"name": "Grace",}'; // 無効なJSON
$data = json_decode($json);
if ($data === null && json_last_error() !== JSON_ERROR_NONE) { // エラーです。
echo "エラー:" . json_last_error_msg();
}

出力:

エラー構文エラー

PHPのベストプラクティス json_decode()

  1. JSONの検証:次のようなツールを使う。 jsonlint またはチェック json_last_error() 有効な入力を保証する。.
  2. 出力タイプを選ぶ:用途 $assoc = true オブジェクトよりも配列にアクセスしたい場合は、配列にアクセスします。.
  3. 大きな整数を扱う:用途 json_bigint_as_string 大きな数値での精度の問題を避けるためである。.
  4. エラー処理を使用する:プリファー json_throw_on_error 最近の PHP アプリケーションでは、エラーを明示的に捕捉するようになっています。.

実用的な使用例

1.APIの構築

APIはしばしばJSONレスポンスを返します。以下は PHP API のエンドポイントの例です:

php
header('Content-Type: application/json');
$data = [
    'status' => 'success'、
    'data' => [
        'users' => [
            ['id' => 1, 'name' => 'Hannah']、
            ['id' => 2, 'name' => 'イアン'] ]。
        ]
    ]
];
echo json_encode($data, JSON_PRETTY_PRINT);;

出力:

json
{
    "status":"成功"、
    "data":{
        "users":[
            {
                "id":1,
                "name":"ハンナ"
            },
            {
                "id":2,
                "name":"イアン"
            }
        ]
    }
}

2.APIの利用

APIからJSONをフェッチするときは json_decode() で応答を処理する:

php
$json = file_get_contents('https://api.example.com/users');
$data = json_decode($json, true);
if (isset($data['users'])){
    foreach ($data['users'] as $user) { 以下のようにします。
        echo $user['name'] ."\n";
    }
}

3.コンフィギュレーションの保存

JSONは設定データを保存するのに理想的だ:

php
$config = [
    'db' => [
        'host' => 'localhost'、
        'user' => 'root'、
        'pass' => 'secret'
    ]
];
file_put_contents('config.json', json_encode($config, JSON_PRETTY_PRINT));

// 後で読む
$json = file_get_contents('config.json');
$config = json_decode($json, true);
echo $config['db']['host']; // localhost

よくある落とし穴と解決策

  1. 非UTF-8データのエンコード:
    • 問題点: json_encode() は無効なUTF-8文字で失敗する。.
    • 解決:を使用して文字列をUTF-8に変換する。 utf8_encode() または mb_convert_encoding().
  2. 大きな整数精度:
    • 問題点:大きな整数を浮動小数点としてデコードすると精度が落ちる。.
    • 解決:用途 json_bigint_as_stringjson_decode().
  3. 無効なJSON入力:
    • 問題点: json_decode() 収益 ヌル 不正なJSONに対して.
    • 解決:JSONを検証して使用する json_last_error() または json_throw_on_error.
  4. ディープ・ネスティング:
    • 問題点:デフォルトの深度制限(512)を超えている。.
    • 解決:$depthを慎重に上げる、, json_encode($data, 0, 1024).

パフォーマンスに関する考察

  • メモリ使用量:大規模なデータセットは、エンコード/デコード時に大量のメモリを消費します。大規模なデータセットにはジェネレータやストリーミングを使用しましょう。.
  • スピード: json_encode() そして json_decode() は高度に最適化されていますが、不必要な変換は避けてください。可能な限りJSONの結果をキャッシュする。.
  • バリデーション:冗長なエンコーディングの試みを避けるために、データを事前に検証する。.

結論

json_encode() そして json_decode() 関数は、JSON データを扱うための PHP の強力なツールです。APIの構築、外部サービスの利用、構造化データの保存など、 これらの関数はJSONを扱うための堅牢かつ柔軟な方法を提供します。関数のオプション、エラー処理、ベストプラクティスを理解することで、よくある落とし穴を回避し、効率的で信頼性の高いコードを書くことができます。提供されている例で実験し、さまざまなフラグを調べ、これらの関数を活用してあなたのコードを効率化してください。 PHPアプリケーション.

主役として PHP開発会社, カーマテック は、PHPおよび関連技術を使用した、ダイナミックでスケーラブル、かつパフォーマンスの高いWebアプリケーションの構築を専門としています。フレームワークやPHPのコア機能に関する深い専門知識を持つ当社の開発者は、お客様のアプリケーションをスピード、セキュリティ、シームレスなデータハンドリングのために最適化し、お客様のビジネスに卓越したデジタル体験を提供できるようにします。.