hajimemath blog

PHP8.3のjson_validateについて

公開日時:2023-12-17T13:11:30.058Z

json_validateとは

今回PHP8.3から導入されたもので、文字列が正しいJSON文字列かを検証するものです。
https://www.php.net/manual/ja/function.json-validate.php

PHP8.3以前のJSON検証

PHP8.3以前でもjsonの検証に関してはjson_decodeを使用していました。
jsonでのデコードが失敗した場合はNULLを戻り値として返すので、以下のように検証をすることができます。

$decodedJson = json_decode('foo');
if (!$decodedJson) {
	return 'Not JSON';
}
return "It's JSON";


PHP8.3でのJSON検証

PHP8.3ではよりシンプルに書くことができます。

if (json_validate('{ "test": { "foo": "bar" } }')) {
    return "It's JSON";
}
return 'Not JSON';


ドキュメントではこのようにあります。

デコードされたJSONペイロードを使わない場合、 json_validate() は json_decode() よりもメモリ使用量が少なくなります。 なぜなら、ペイロードを含む配列やオブジェクト構造を組み立てる必要がないからです。

json_decodeはパースに際しZVAL構造体を作ったりするため、メモリや処理速度に影響があるらしいです。

また警告として

jsondecode() の直前に jsonvalidate() をコールすると、 文字列を不必要に2回パースすることになります。 なぜなら、json_decode() はデコードしている間に暗黙のうちに文字列を検証するからです。
よって json_validate() は、JSON のペイロードをすぐに使わない場合、かつ有効なJSON文字列かどうかを知る必要がある場合にのみ使うべきです。

とあります。

フレームワークを使って開発をしている場合は、JSONのペイロードを使わない場合というケースが思いつかないですが、内部のバリデーション等に使用されることでパフォーマンスの改善がされそうですね!