ホームページ  >  記事  >  バックエンド開発  >  PHP の json_encode() 関数エラーの理由と解決策

PHP の json_encode() 関数エラーの理由と解決策

王林
王林オリジナル
2023-05-11 09:03:053445ブラウズ

Web アプリケーションの継続的な開発に伴い、データ対話は非常に重要なリンクになっています。その中でも、JSON (JavaScript Object Notation) は、フロントエンドとバックエンドのデータ対話に広く使用されている軽量のデータ交換形式です。 PHP では、 json_encode() 関数は PHP 配列またはオブジェクトを JSON 形式の文字列に変換でき、 json_decode() 関数は JSON 形式の文字列を PHP 配列またはオブジェクトに変換できます。ただし、json_encode() 関数でエラーが発生する場合がありますので、この記事ではそのようなエラーの原因と解決策について説明します。

1. json_encode() 関数の一般的なエラー

  1. JSON_ERROR_UTF8

このエラーは、PHP 配列またはオブジェクトに無効な UTF -8 文字が含まれているために発生します。 PHP では、UTF-8 は Web 上で Unicode 文字を送信および保存するために使用されるエンコーディングです。ただし、ISO-8859-1 などのエンコード形式の文字など、UTF-8 以外の文字が文字列に表示される場合があり、これらの文字によって JSON_ERROR_UTF8 エラーが発生します。例:

$array = array(
    'name' => '张三',
    'email' => '张三@example.com',

);
$json = json_encode($array);

上記のコードは JSON_ERROR_UTF8 エラーを生成します。

  1. JSON_ERROR_DEPTH

このエラーの理由は、PHP 配列またはオブジェクトのレベルが深すぎて、 json_encode() 関数が処理できる制限を超えているためです。デフォルトでは、 json_encode() 関数が処理できるレイヤーの最大数は 128 です。例:

$array = array();
for($i = 1; $i <= 150; $i++){
    $array = array(
        'level'.$i => $array
    );
}
$json = json_encode($array);

上記のコードは JSON_ERROR_DEPTH エラーを生成します。

  1. JSON_ERROR_RECURSION

このエラーが発生する理由は、PHP 配列またはオブジェクトに循環参照があることです。例:

class Person{
    public $name;
    public $spouse;
}
$person1 = new Person();
$person1->name = '张三';
$person2 = new Person();
$person2->name = '李四';
$person1->spouse = $person2;
$person2->spouse = $person1;
$json = json_encode($person1);

上記のコードは JSON_ERROR_RECURSION エラーを生成します。

  1. その他のエラー

上記の 3 つのエラーに加えて、json_encode() 関数によって、JSON_ERROR_CTRL_CHAR、JSON_ERROR_SYNTAX などの他のエラーが発生する場合もあります。

2. 解決策

エラーごとにさまざまな解決策があります。

  1. JSON_ERROR_UTF8 エラーの解決

PHP 配列またはオブジェクトに UTF-8 以外の文字が含まれている場合は、PHP の組み込み mb_convert_encoding() 関数を使用して、それを UTF-8 に変換できます。 UTF-8形式。例:

$array = array(
    'name' => '张三',
    'email' => '张三@example.com',

);
foreach($array as &$value){
    $value = mb_convert_encoding($value, 'UTF-8', 'GBK');
}
unset($value);
$json = json_encode($array);
  1. JSON_ERROR_DEPTH エラーの解決策

PHP 配列またはオブジェクトのレベルが深すぎる場合は、json_encode( ) 指定する関数 処理できる最大レイヤー数。例:

$array = array();
for($i = 1; $i <= 150; $i++){
    $array = array(
        'level'.$i => $array
    );
}
$json = json_encode($array, JSON_PARTIAL_OUTPUT_ON_ERROR | JSON_UNESCAPED_UNICODE, 512);

上記のコードでは、options パラメーターの値は 512、つまりレイヤーの最大数は 512 です。このレベル数を超えると、JSON_ERROR_DEPTH エラーが生成されます。

  1. JSON_ERROR_RECURSION エラーの解決策

PHP 配列またはオブジェクトで循環参照が発生した場合、 json_encode() 関数の 2 番目のパラメーターを使用して、トラバース可能なオブジェクトを指定できます。オブジェクト (イテレータなど)。例:

class Person{
    public $name;
    public $spouse;
    public function jsonSerialize(){
        return [
            'name' => $this->name,
            'spouse' => $this->spouse->name
        ];
    }
}
$person1 = new Person();
$person1->name = '张三';
$person2 = new Person();
$person2->name = '李四';
$person1->spouse = $person2;
$person2->spouse = $person1;
$json = json_encode(array(
    'person1' => $person1,
    'person2' => $person2
), JSON_PARTIAL_OUTPUT_ON_ERROR, 512);

上記のコードでは、Person クラスは jsonSerialize() メソッドを実装しています。このメソッドは、オブジェクトを JSON 文字列にシリアル化するための json_encode() 関数の配列を返します。これを使用する場合、json_encode() 関数を呼び出すときに、JSON_PARTIAL_OUTPUT_ON_ERROR 定数を 2 番目のパラメーターとして渡すだけです。

  1. 他のエラーを解決する

他のエラーの解決策は、特定の状況に応じて分析および処理する必要があります。

要約すると、json_encode() 関数は、PHP 配列またはオブジェクトを JSON 形式の文字列に簡単にシリアル化できますが、使用する場合は、渡されたデータが正当であるかどうかに注意し、適切なエラー処理を実行する必要があります。 。

以上がPHP の json_encode() 関数エラーの理由と解決策の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。