PHPでは、 JSonserializableインターフェイスは、オブジェクトのカスタムシリアル化をJSON形式に実装するための重要な手段です。ただし、多くの人々は、開発中にこのインターフェイスを実装する際に一般的な問題に遭遇します。これは、期待を満たしたりスローエラーを投げかけたりしないシリアル化結果につながることがよくあります。この記事では、これらの一般的なエラーの原因を詳細に紹介し、効果的なトラブルシューティングとソリューションを提供します。
クラスがjSonserializableインターフェイスを実装しているが、 jsonserialize()メソッドを定義しない場合、またはメソッドの署名が正しくない場合、 json_encode()を実行するとPHPがエラーをスローします。
class User implements JsonSerializable {
// 間違い:未定義jsonSerialize方法
}
または:
class User implements JsonSerializable {
// 間違い:方法签名間違い
public function jsonSerialize($extraParam) {
return [];
}
}
正しい署名jsonserialize()メソッドが実装されていることを確認する必要があります。
class User implements JsonSerializable {
private $name;
private $email;
public function __construct($name, $email) {
$this->name = $name;
$this->email = $email;
}
public function jsonSerialize(): mixed {
return [
'name' => $this->name,
'email' => $this->email
];
}
}
jsonserialize()メソッドの返品値は、json_encode()で正しく処理できるデータ型(配列、オブジェクト、スカラーなど)でなければなりません。 json_encode()は、リソースタイプが返された場合、または未処理の円形参照を含むデータ構造に障害があります。
class Test implements JsonSerializable {
public $fp;
public function __construct() {
$this->fp = fopen("php://memory", "r");
}
public function jsonSerialize(): mixed {
return $this->fp; // 間違い:リソースタイプをシリアル化することはできません
}
}
JSONがシリアル化できないデータ型を返すことは避けてください。複雑な構造の場合、シリアル化可能であることを確認する必要があります。
public function jsonSerialize(): mixed {
return [
'file_pointer' => 'not serializable'
];
}
開発プロセス中、ユーザーパスワードやトークンなどの機密情報をシリアル化する問題を簡単に無視することができます。
public function jsonSerialize(): mixed {
return get_object_vars($this); // すべての属性が返されます,機密情報が含まれています
}
誤って機密データの公開を避けるためにシリアル化する必要があるフィールドを明示的に定義します。
public function jsonSerialize(): mixed {
return [
'username' => $this->username,
// 意図的にパスワードフィールドを返さない
];
}
いくつかのシナリオでは、開発者は匿名のクラスをシリアル化したり、プロパティに閉鎖を保管したりしようとする場合があります。
$object = new class implements JsonSerializable {
public $closure;
public function __construct() {
$this->closure = function () {};
}
public function jsonSerialize(): mixed {
return $this;
}
};
シリアル化データに閉鎖を含めないでください。必要に応じて構造化データに変換してください。
public function jsonSerialize(): mixed {
return [
'status' => 'closure removed for serialization'
];
}
json_last_error_msg() : json_encode()の直後にこの関数を呼び出して、特定のエラー情報を取得します。これは問題を見つけるのに役立ちます。
ステップバイステップ除去方法: jsonserialize()メソッドのアイテムごとにフィールドアイテムを削除して、障害を引き起こした特定のデータを見つけます。
Breakpoint DebuggingまたはLogging :Debugging Tools(XDebugなど)またはログ( ERROR_LOG()など)を使用すると、エラーコンテキストの追跡に役立ちます。
出力の結果を確認します。https: //gitbox.net/json-validatorなどのオンラインツールを使用して、JSON出力が形式で合法かどうかを確認します。
JSonserializableインターフェイス自体を実装することは複雑ではありませんが、複雑なデータ構造、過失、またはシリアル化の原則の理解の欠如のために間違いを犯すのは簡単です。上記の一般的なエラーとそのトラブルシューティングスキルをマスターすると、実際のプロジェクトのシリアル化の問題を効果的に回避し、コードの品質とセキュリティを改善できます。