JsonData = []; } /** * Деструктор класса. */ public function __destruct () { unset($this->JsonData); } /** * Сохраняем JSON в файл. * * @param string $fileName Имя файла. * * @return void * @throws JsonException Если файл не может быть сохранен. */ public function SaveToFile (string $fileName): void { // Запись данных в файл file_put_contents($fileName, json_encode($this->JsonData, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE)); // Проверка на ошибки if (json_last_error() !== JSON_ERROR_NONE) // - если есть ошибки, выбрасываем исключение throw new JsonException($fileName, json_last_error(), json_last_error_msg()); } /** * Загрузка данных из JSON-файла. * * @param string $fileName Имя файла. * * @return void * @throws JsonException Если файл не существует или содержит ошибки. */ public function LoadFromFile (string $fileName): void { // Проверка существования файла if (!is_file($fileName)) // - нет? Выбрасываем исключение throw new JsonException($fileName, -1, "File does not exist / Файл не существует"); // Чтение содержимого файла и преобразование JSON в объект $this->JsonData = json_decode(file_get_contents($fileName), true); // Проверка на ошибки if ($this->JsonData === null && json_last_error() !== JSON_ERROR_NONE) // - если есть ошибки, выбрасываем исключение throw new JsonException($fileName, json_last_error(), json_last_error_msg()); } /** * Проверяем наличие ключа в JSON. * * @param string $key Ключ. * * @return bool true если ключ найден, false если нет. */ public function IsKeyExists (string $key): bool { // Получаем массив ключей по вложенности $keys = $this->ParseKey($key); // Получаем текущий массив данных $current = $this->JsonData; // Для каждого ключа foreach ($keys as $key) { // - проверяем наличие ключа в текущем массиве if (!array_key_exists($key, $current)) // - нет? Возвращаем false return false; // Переходим ко вложенному массиву $current = $current[$key]; } // Возвращаем true, если все ключи найдены return true; } /** * Получение ключей по вложенности. Т.е., ключи вида "key1/key2/key3" => ["key1", "key2", "key3"]. * * @param string $key Ключ. * * @return array Ключи по вложенности. */ private function ParseKey (string $key): array { return explode('/', $key); } /** * Создание ключа в JSON. * * @param string $key Ключ. * @param mixed $value Значение. * * @return void * @throws JsonException Если ключ не является массивом. */ private function CreateKey (string $key, mixed $value): void { // Получаем массив ключей по вложенности $keys = $this->ParseKey($key); // Получаем текущий массив данных $current = &$this->JsonData; // Для каждого ключа до предпоследнего for ($i = 0; $i < count($keys) - 1; $i++) { // - проверяем наличие ключа в текущем массиве if (!isset($current[$keys[$i]])) // - нет? Создаем ключ (массив) $current[$keys[$i]] = []; // - проверяем, что ключ является массивом if (!is_array($current[$keys[$i]])) // - нет? Выбрасываем исключение throw new JsonException(null, -1, "Key is not an array / Ключ не является массивом!"); // - переходим ко вложенному массиву $current = &$current[$keys[$i]]; } // Создаем ключ (значение) $current[$keys[count($keys) - 1]] = $value; } // Подключаем методы чтения JSON use JsonReWriterReadTrait; }