(PECL simdjson >= 2.0.0)
simdjson_decode — 解碼 JSON 字串
接收一個 JSON 編碼的字串並將其轉換為 PHP 值。當電腦架構支援時,此函式使用比 json_decode() 更快的單指令多數據 (SIMD) 實作。
json
要解碼的 json
字串。
此函式僅適用於 UTF-8 編碼的字串。
此函式可以解析 json_decode() 可解碼的有效輸入,前提是它們的長度小於 4 GiB。
associative
depth
要解碼的結構的最大嵌套深度。該值必須大於 0
,且小於或等於 2147483647
。呼叫者應使用合理的小值,因為較大的深度需要更多的緩衝區空間,並且會增加遞迴深度,這與目前的 json_decode() 實作不同。
如果 json
無效,則從 PECL simdjson 2.1.0 開始會拋出 SimdJsonException,而先前會拋出 RuntimeException。
如果 depth
超出允許範圍,則從 PECL simdjson 3.0.0 開始會拋出 SimdJsonValueError,而先前會引發層級為 E_WARNING
的錯誤。
範例 #1 simdjson_decode() 範例
<?php
$json = '{"a":1,"b":2,"c":3}';
var_dump(simdjson_decode($json));
var_dump(simdjson_decode($json, true));
?>
以上範例將輸出
object(stdClass)#1 (3) { ["a"]=> int(1) ["b"]=> int(2) ["c"]=> int(3) } array(3) { ["a"]=> int(1) ["b"]=> int(2) ["c"]=> int(3) }
範例 #2 訪問無效的物件屬性
訪問物件中包含 PHP 命名慣例不允許的字元(例如連字號)的元素,可以透過將元素名稱用大括號和單引號括起來來完成。
<?php
$json = '{"foo-bar": 12345}';
$obj = simdjson_decode($json);
print $obj->{'foo-bar'}; // 12345
?>
範例 #3 使用 simdjson_decode() 的常見錯誤
<?php
// 以下字串是有效的 JavaScript,但不是有效的 JSON
// 名稱和值必須用雙引號括起來
// 單引號無效
$bad_json = "{ 'bar': 'baz' }";
simdjson_decode($bad_json); // 拋出 SimdJsonException
// 名稱必須用雙引號括起來
$bad_json = '{ bar: "baz" }';
simdjson_decode($bad_json); // 拋出 SimdJsonException
// 不允許尾隨逗號
$bad_json = '{ bar: "baz", }';
simdjson_decode($bad_json); // 拋出 SimdJsonException
?>
範例 #4 depth
錯誤
<?php
// 使用最大深度為 4 編碼一些資料
// (陣列 -> 陣列 -> 陣列 -> 字串)
$json = json_encode(
[
1 => [
'English' => [
'One',
'January'
],
'French' => [
'Une',
'Janvier'
]
]
]
);
// 顯示不同深度的錯誤。
var_dump(simdjson_decode($json, true, 4));
try {
var_dump(simdjson_decode($json, true, 3));
} catch (SimdJsonException $e) {
echo "Caught: ", $e->getMessage(), "\n";
}
?>
以上範例將輸出
array(1) { [1]=> array(2) { ["English"]=> array(2) { [0]=> string(3) "One" [1]=> string(7) "January" } ["French"]=> array(2) { [0]=> string(3) "Une" [1]=> string(7) "Janvier" } } } Caught: The JSON document was too deep (too many nested objects and arrays)
範例 #5 simdjson_decode() 處理大整數
<?php
$json = '{"number": 12345678901234567890}';
var_dump(simdjson_decode($json));
?>
以上範例將輸出
object(stdClass)#1 (1) { ["number"]=> float(1.2345678901235E+19) }
注意:
JSON 規範不是 JavaScript,而是 JavaScript 的一個子集。
注意:
如果解碼失敗,會拋出 SimdJsonException 例外,並且可以使用 SimdJsonException::getCode() 和 SimdJsonException::getMessage() 來判斷錯誤的確切性質。