PHP Conference Japan 2024

json_validate

(PHP 8 >= 8.3.0)

json_validate檢查字串是否包含有效的 JSON

說明

json_validate(字串 $json, 整數 $depth = 512, 整數 $flags = 0): 布林值

返回給定字串在語法上是否為有效的 JSON。如果 json_validate() 返回 true,則在使用相同的 depthflags 時,json_decode() 將成功解碼給定的字串。

如果 json_validate() 返回 false,可以使用 json_last_error()json_last_error_msg() 來取得錯誤原因。

如果不需要使用解碼後的 JSON 負載,json_validate()json_decode() 使用更少的記憶體,因為它不需要建立包含負載的陣列或物件結構。

注意

json_decode() 之前立即呼叫 json_validate() 會不必要地將字串解析兩次,因為 json_decode() 在解碼過程中會隱含地執行驗證。

因此,只有在不立即使用解碼後的 JSON 負載,且需要知道字串是否包含有效的 JSON 時,才應該使用 json_validate()

參數

json

要驗證的字串。

此函式僅適用於 UTF-8 編碼的字串。

注意事項:

PHP 實作了原始 » RFC 7159 中指定的 JSON 的超集。

depth

正在解碼的結構的最大嵌套深度。該值必須大於 0,且小於或等於 2147483647

flags

目前僅接受 JSON_INVALID_UTF8_IGNORE

返回值

如果給定的字串是語法有效的 JSON,則返回 true,否則返回 false

錯誤/例外

如果 depth 超出允許範圍,則會拋出 ValueError

如果 flags 不是有效的旗標,則會拋出 ValueError

範例

範例 #1 json_validate() 範例

<?php
var_dump
(json_validate('{ "test": { "foo": "bar" } }'));
var_dump(json_validate('{ "": "": "" } }'));
?>

上述範例將輸出

bool(true)
bool(false)

參見

新增筆記

使用者貢獻的筆記 2 則筆記

Behrad
10 個月前
---------------- 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

備註:程式碼來自 https://php.dev.org.tw/releases/8.3/en.php
Julien T.
9 個月前
基於 Allan R. 的初始構想,我為使用 PHP 8.2 和更早版本的使用者開發了改進版的 json_validate 函式。此函式模擬了 PHP 8.3 中引入的功能,提供在早期 PHP 版本中驗證 JSON 字串的有效方法。

```php
if (!function_exists('json_validate')) {
/**
* 驗證 JSON 字串。
*
* @param string $json 要驗證的 JSON 字串。
* @param int $depth 最大深度。必須大於零。
* @param int $flags JSON 解碼選項的位元遮罩。
* @return bool 如果字串是有效的 JSON,則返回 true,否則返回 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;
}
}
}
```

主要改進

- 字串檢查:新增了驗證以確保輸入是字串。
- 錯誤處理:利用 try-catch 有效地捕捉和處理 JsonException。
- 向下相容性:可安全地整合到舊版 PHP 版本中,並在 PHP 8.3+ 中自動延遲到原生功能。
To Top