PHP Conference Japan 2024

simdjson_decode

(PECL simdjson >= 2.0.0)

simdjson_decode解碼 JSON 字串

說明

simdjson_decode(字串 $json, 布林值 $associative = false, 整數 $depth = 512): 混合型別

接收一個 JSON 編碼的字串並將其轉換為 PHP 值。當電腦架構支援時,此函式使用比 json_decode() 更快的單指令多數據 (SIMD) 實作。

參數

json

要解碼的 json 字串

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

此函式可以解析 json_decode() 可解碼的有效輸入,前提是它們的長度小於 4 GiB。

associative

當設為 true 時,JSON 物件將以關聯式 陣列 返回;當設為 false 時,JSON 物件將以 物件 返回。

depth

要解碼的結構的最大嵌套深度。該值必須大於 0,且小於或等於 2147483647。呼叫者應使用合理的小值,因為較大的深度需要更多的緩衝區空間,並且會增加遞迴深度,這與目前的 json_decode() 實作不同。

返回值

以適當的 PHP 類型返回 json 中編碼的值。值 truefalsenull 分別以 truefalsenull 返回。

錯誤/例外

如果 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() 來判斷錯誤的確切性質。

另請參閱

新增註解

使用者貢獻的註解

此頁面沒有使用者貢獻的註解。
To Top