Statement on glibc/iconv Vulnerability

simdjson_decode

(PECL simdjson >= 2.0.0)

simdjson_decodeДекодирует строку JSON

Описание

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

Принимает строку в кодировке JSON и преобразовывает её в значение PHP. При этом будет использована более быстрая реализация Simultaneous Instruction, Multiple Data, чем в функции json_decode(), если это поддерживается архитектурой компьютера.

Список параметров

json

Декодируемая строка (string) в json формате.

Функция работает только со строками в кодировке UTF-8.

Функция анализирует допустимые входные данные, которые функция json_decode() может декодировать, при условии, что их длина не превышает 4 Гб.

associative

При значении true, объекты JSON будут возвращены как ассоциативные массивы (array); при значении false, объекты JSON будут возвращены как объекты (object).

depth

Максимальная глубина вложенности декодируемой структуры. Значение должно быть больше 0 и меньше или равно 2147483647. Вызывающие команды должны использовать достаточно маленькие значения, поскольку большая глубина требуют больше места в буфере и увеличивают глубину рекурсии, в отличие от текущей реализации функции json_decode().

Возвращаемые значения

Возвращает значение, закодированное в параметре json в соответствующем типе PHP. Значения true, false и null возвращаются как true, false и null соответственно.

Ошибки

Если параметр 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
// (array -> array -> array -> string)
$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
"Попался: ", $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"
    }
  }
}
Попался: 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() могут быть использованы для определения точной природы ошибки.

Смотрите также

  • json_encode() - Возвращает JSON-представление данных
  • json_decode() - Декодирует строку JSON

add a note

User Contributed Notes

There are no user contributed notes for this page.
To Top