json_validate
(PHP 8 >= 8.3.0)
json_validate — 文字列が有効なJSONかどうかを調べる
説明
指定された文字列が、文法的に有効なJSONかどうかを返します。
json_validate() が true
を返す場合、
同じ depth
と flags
を指定して json_decode() を実行してもデコードは成功します。
json_validate() が false
を返す場合、
原因は json_last_error() と
json_last_error_msg() を使って取得できます。
デコードされたJSONペイロードを使わない場合、 json_validate() は json_decode() よりもメモリ使用量が少なくなります。 なぜなら、ペイロードを含む配列やオブジェクト構造を組み立てる必要がないからです。
json_decode() の直前に json_validate() をコールすると、 文字列を不必要に2回パースすることになります。 なぜなら、json_decode() はデコードしている間に暗黙のうちに文字列を検証するからです。
よって json_validate() は、JSON のペイロードをすぐに使わない場合、かつ有効なJSON文字列かどうかを知る必要がある場合にのみ使うべきです。
パラメータ
json
-
検証する文字列
この関数は、UTF-8 でエンコードされた文字列でのみ動作します。
注意:
PHP の実装は、 » RFC 7159 の JSON のスーパーセットです。
depth
-
デコードされるネスト構造の深さの最大値。 この値は
0
より大きく、2147483647
以下でなければいけません。 flags
-
現状は、
JSON_INVALID_UTF8_IGNORE
のみを受け入れます。
例
例1 json_validate() の例
<?php
var_dump(json_validate('{ "test": { "foo": "bar" } }'));
var_dump(json_validate('{ "": "": "" } }'));
?>
上の例の出力は以下となります。
bool(true) bool(false)
参考
- json_decode() - JSON 文字列をデコードする
- json_last_error() - 直近に発生したエラーを返す
- json_last_error_msg() - 直近の json_encode() や json_decode() の呼び出しのエラー文字列を返す
User Contributed Notes 2 notes
---------------- PHP < 8.3 ----------------
function json_validate(string $string): bool {
json_decode($string);
return json_last_error() === JSON_ERROR_NONE;
}
var_dump(json_validate('{ "test": { "foo": "bar" } }')); // true
---------------- PHP >= 8.3 ----------------
var_dump(json_validate('{ "test": { "foo": "bar" } }')); // true
Note: code from https://www.php.net/releases/8.3/en.php
Building upon Allan R.'s initial idea, I've developed an improved version of the json_validate function for those using PHP 8.2 and earlier versions. This function emulates the functionality introduced in PHP 8.3, providing an effective way to validate JSON strings in earlier PHP versions.
```php
if (!function_exists('json_validate')) {
/**
* Validates a JSON string.
*
* @param string $json The JSON string to validate.
* @param int $depth Maximum depth. Must be greater than zero.
* @param int $flags Bitmask of JSON decode options.
* @return bool Returns true if the string is a valid JSON, otherwise false.
*/
function json_validate($json, $depth = 512, $flags = 0) {
if (!is_string($json)) {
return false;
}
try {
json_decode($json, false, $depth, $flags | JSON_THROW_ON_ERROR);
return true;
} catch (\JsonException $e) {
return false;
}
}
}
```
Key Improvements:
- String Check: Added a validation to ensure the input is a string.
- Error Handling: Utilizes try-catch to effectively catch and handle JsonException.
- Backward Compatibility: Safely integrable in older PHP versions, automatically deferring to native functionality in PHP 8.3+.