simdjson_decode

(PECL simdjson >= 2.0.0)

simdjson_decode解码 JSON 字符串

描述

simdjson_decode(string $json, bool $associative = false, int $depth = 512): mixed

接受一个 JSON 编码字符串并将其转换为 PHP 值。当计算机体系结构支持时,它使用比 json_decode() 更快的单指令多数据 (SIMD) 实现。

参数

json

正在解码的 json string

此函数仅适用于 UTF-8 编码字符串。

此函数解析 json_decode() 可以解码的有效输入,前提是它们小于 4 GiB。

associative

当为 true 时,JSON 对象将作为关联 array 返回;当为 false 时,JSON 对象将作为 object 返回。

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