Web アプリケーションの継続的な開発に伴い、データ対話は非常に重要なリンクになっています。その中でも、JSON (JavaScript Object Notation) は、フロントエンドとバックエンドのデータ対話に広く使用されている軽量のデータ交換形式です。 PHP では、 json_encode() 関数は PHP 配列またはオブジェクトを JSON 形式の文字列に変換でき、 json_decode() 関数は JSON 形式の文字列を PHP 配列またはオブジェクトに変換できます。ただし、json_encode() 関数でエラーが発生する場合がありますので、この記事ではそのようなエラーの原因と解決策について説明します。
1. json_encode() 関数の一般的なエラー
このエラーは、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 エラーを生成します。
このエラーの理由は、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 エラーを生成します。
このエラーが発生する理由は、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 エラーを生成します。
上記の 3 つのエラーに加えて、json_encode() 関数によって、JSON_ERROR_CTRL_CHAR、JSON_ERROR_SYNTAX などの他のエラーが発生する場合もあります。
2. 解決策
エラーごとにさまざまな解決策があります。
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);
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 エラーが生成されます。
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 番目のパラメーターとして渡すだけです。
他のエラーの解決策は、特定の状況に応じて分析および処理する必要があります。
要約すると、json_encode() 関数は、PHP 配列またはオブジェクトを JSON 形式の文字列に簡単にシリアル化できますが、使用する場合は、渡されたデータが正当であるかどうかに注意し、適切なエラー処理を実行する必要があります。 。
以上がPHP の json_encode() 関数エラーの理由と解決策の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。