20250629 1.1 Stable
This commit is contained in:
		
							
								
								
									
										710
									
								
								sources/classes/JsonReWriter.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										710
									
								
								sources/classes/JsonReWriter.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,710 @@ | ||||
| # Описание класса JsonReWriter | ||||
|  | ||||
| ## Информация о версии | ||||
|  | ||||
| Версия класса: 1.0 | ||||
|  | ||||
| Впервые введено в пакет с версии: 1.1.0 | ||||
|  | ||||
| Описание класса: Класс для работы с JSON-файлами. | ||||
|  | ||||
| ## Публичные свойства и константы класса | ||||
|  | ||||
| В классе определены следующие свойства: | ||||
|  | ||||
| - `string $JsonString` - строка JSON (чтение/запись). | ||||
|  | ||||
| ## Быстрый старт | ||||
|  | ||||
| ### Правила формирования ключей. | ||||
|  | ||||
| Ключ для чтения/записи данных класса формируется следующим образом: `ключ/подключ/подключ подключа` . | ||||
|  | ||||
| Например, если дан json-файл: | ||||
|  | ||||
|     { | ||||
| 	    "test": { | ||||
| 	        "subtest": { | ||||
| 	            "AAA": "123", | ||||
| 	            "BBB": 1.23 | ||||
| 	        } | ||||
| 	    }, | ||||
| 	    "test1": { | ||||
| 	        "test": 123 | ||||
| 	    }, | ||||
| 	    "test2": { | ||||
| 	        "test": true | ||||
| 	    }, | ||||
| 	    "test3": { | ||||
| 	        "test": { | ||||
| 	            "res": "[1,2,3]" | ||||
| 	        } | ||||
| 	    } | ||||
|     } | ||||
|  | ||||
| Пусть требуется получить значение `BBB`, тогда ключ должен быть `test/subtest/BBB`. | ||||
|  | ||||
| ### Чтение. | ||||
|  | ||||
| 1. Создайте элемент класса `$json = new JsonReWriter ();` | ||||
| 2. Если у вас требуется загрузить json из файла `$fileName`, то воспользуйтесь методом `LoadFromFile`: | ||||
|    `$json->LoadFromFile($fileName);`, если же json представлен строкой `$jsonStr`, то загрузите её в свойство | ||||
|    `$JsonString`: `$json->JsonString = $jsonStr;` | ||||
| 3. Далее можно пользоваться любым методом для чтения `Read*`, в том числе и общим `$json->Read(...)`. | ||||
|  | ||||
| **Пример:** | ||||
|  | ||||
| 	// Имя файла | ||||
|     $fileName = __DIR__ . "/test.json"; | ||||
|     // Создаю класс | ||||
| 	$json = new JsonReWriter(); | ||||
| 	// Загшружаю данные из файла | ||||
| 	$json->LoadFromFile($fileName); | ||||
| 	// Получаю число | ||||
| 	$float = $json->ReadFloat("test/subtest/BBB", 0.2); | ||||
|  | ||||
| В итоге в `$float` будет `1.23`. | ||||
|  | ||||
| ### Запись. | ||||
|  | ||||
| 1. Создайте элемент класса `$json = new JsonReWriter ();` | ||||
| 2. Далее можно пользоваться любым методом для записи `Write*`, в том числе и общим `$json->Write(...)`. | ||||
| 3. Если вам требуется создать json файл с именем `$fileName`, то воспользуйтесь методом `SaveToFile`: | ||||
|    `$json->SaveToFile($fileName);`, если же json должен быть представлен строкой `$jsonStr`, то загрузите её из свойства | ||||
|    `$JsonString`: `$jsonStr = $json->JsonString;` | ||||
|  | ||||
| **Пример:** | ||||
|  | ||||
| 	// Имя файла | ||||
|     $fileName = __DIR__ . "/test.json"; | ||||
|     // Создаю класс | ||||
| 	$json = new JsonReWriter(); | ||||
| 	// Загшружаю данные из файла | ||||
| 	$json->LoadFromFile($fileName); | ||||
| 	// Получаю число | ||||
| 	try { | ||||
| 		$json->Write("test/subtest/BBB", 0.2); | ||||
| 	} | ||||
| 	catch (JsonException $e) { | ||||
| 		echo $e->getMessage(); | ||||
| 	} | ||||
|  | ||||
| В итоге в `test/subtest/BBB` вместо `1.23` будет `0.2`. | ||||
|  | ||||
| ## Коды ошибок JsonErrorCode | ||||
|  | ||||
| Ниже представлена таблица основных кодов ошибки: | ||||
|  | ||||
| |       Ошибка        |                                  Описание                                   | Введено с версии |   | ||||
| |:-------------------:|:---------------------------------------------------------------------------:|:----------------:|   | ||||
| |       Unknown       |                             Неизвестная ошибка                              |       1.0        |   | ||||
| |        None         |                                 Ошибок нет                                  |       1.0        |   | ||||
| |        Depth        |                    Достигнута максимальная глубина стека                    |       1.0        |   | ||||
| |    StateMismatch    |                       Неверный или некорректный JSON                        |       1.0        |   | ||||
| |      CTRLChar       |          Ошибка управляющего символа, возможно, неверная кодировка          |       1.0        |   | ||||
| |       Syntax        |                            Синтаксическая ошибка                            |       1.0        |   | ||||
| |        UTF8         |   Некорректные для кодировки UTF-8 символы, возможно, неверная кодировка    |       1.0        |   | ||||
| |      Recursion      |         Одна или несколько зацикленных ссылок в кодируемом значении         |       1.0        |   | ||||
| |      InfOrNan       |        Одно или несколько значений NAN или INF в кодируемом значении        |       1.0        |   | ||||
| |   UnsupportedType   |                 Передали значение с неподдерживаемым типом                  |       1.0        |   | ||||
| | InvalidPropertyName |                   Имя свойства не может быть закодировано                   |       1.0        |   | ||||
| |        UTF16        | Некорректный для кодировки UTF-16 символ, возможно, некорректно закодирован |       1.0        |   | ||||
| |    KeyIsNotArray    |         Ключ не содержит вложений, хотя от него требуется обратное          |       1.0        |   | ||||
| |  NotISerializable   |                 Класс не реализует интерфейс ISerializable                  |       1.0        | | ||||
|  | ||||
| ### Методы и функции перечисления JsonErrorCode | ||||
|  | ||||
| Перечисление содержит **статический метод** `static function FromLastError (): JsonErrorCode`, который получает код | ||||
| ошибки из последней JSON ошибки. | ||||
|  | ||||
| Например, при успешной загрузке, можем проверить ошибки: | ||||
|  | ||||
|     $errors = JsonErrorCode::FromLastError (); | ||||
|  | ||||
| После того, как мы выведем `$errors`, мы получим `JsonErrorCode::None`. | ||||
|  | ||||
| ## Исключение JsonException | ||||
|  | ||||
| Исключение расширяет класс `Exception`, поэтому может выбрасываться через `throw`. | ||||
|  | ||||
| ### Свойства | ||||
|  | ||||
| Исключение содержит следующие свойства: | ||||
|  | ||||
| - `?string $JsonString` - строка JSON (или null); | ||||
| - `JsonErrorCode $ErrorCode` - код ошибки JSON; | ||||
| - `?string $ErrorMessage` - сообщение об ошибке JSON (в отличие от функции json_last_error_msg(), данная переменная при | ||||
|   отсутствии ошибок выводит null, а не "No error"). | ||||
|  | ||||
| ### Методы и функции | ||||
|  | ||||
| #### Конструктор. | ||||
|  | ||||
| Конструктор принимает **3 необязательных параметра**: | ||||
|  | ||||
| * `?string $json` - строка JSON (по умолчанию, `null`); | ||||
| * `JsonErrorCode $errorCode` - код ошибки (по умолчанию, `JsonErrorCode::Unknown`); | ||||
| * `?string $errorMessage` - сообщение об ошибке (по умолчанию, `null`). | ||||
|  | ||||
| В результате создаётся новое исключение `JsonException`. | ||||
|  | ||||
| Пример: | ||||
|  | ||||
|     throw new JsonException("{}", JsonErrorCode::Depth, "Пример"); | ||||
|  | ||||
| Создаст исключение `JsonException`. | ||||
|  | ||||
| ## Методы и функции | ||||
|  | ||||
| ### Конструктор и деструктор. | ||||
|  | ||||
| Конструктор не принимает никаких параметров. | ||||
|  | ||||
| В результате создаётся новый класс `JsonReWriter`. | ||||
|  | ||||
| **Пример:** | ||||
|  | ||||
|     // Контсуктор | ||||
|     $json = new JsonReWriter (); | ||||
|     // Деструктор | ||||
|     unset($json); | ||||
|  | ||||
| Создаст и уничтожит класс `JsonReWriter`. | ||||
|  | ||||
| ### Сохранение и загрузка из файла. | ||||
|  | ||||
| За сохранение и загрузку отвечают 2 метода: `SaveToFile` и `LoadFromFile`. | ||||
|  | ||||
| #### Сохранение в файл (метод `SaveToFile`) | ||||
|  | ||||
| Этот метод сохраняет содержимое JSON в файл. Он содержит **1 обязательный параметр**: | ||||
|  | ||||
| * `string $fileName` - имя файла на диске. | ||||
|  | ||||
| Метод возвращает `bool` - сохранены ли данные в файл: `true` - да, `false` - нет. | ||||
|  | ||||
| Синтаксис: | ||||
|  | ||||
|     public function SaveToFile (string $fileName): bool | ||||
|  | ||||
| **Пример:** | ||||
|  | ||||
|     // Имя файла | ||||
|     $fileName = __DIR__ . "/test.json"; | ||||
|     // Создаём класс | ||||
|     $json = new JsonReWriter(); | ||||
|     // Заполним данными | ||||
|     try { | ||||
|         $json->Write("test/subtest/AAA", "123"); | ||||
|         $json->Write("test/subtest/BBB", 1.23); | ||||
|         $json->Write("test1/test", 123); | ||||
|         $json->Write("test2/test", true); | ||||
|         $json->WriteArray("test3/test/res", [1, 2, 3]); | ||||
|     } catch (JsonException $e) { | ||||
| 	    echo $e->getMessage(); | ||||
| 	} | ||||
| 	// Сохраняем созданный JSON файл | ||||
| 	$json->SaveToFile($fileName); | ||||
|  | ||||
| Содержимое файла `test.json` представлено далее: | ||||
|  | ||||
|     { | ||||
| 	    "test": { | ||||
| 	        "subtest": { | ||||
| 	            "AAA": "123", | ||||
| 	            "BBB": 1.23 | ||||
| 	        } | ||||
| 	    }, | ||||
| 	    "test1": { | ||||
| 	        "test": 123 | ||||
| 	    }, | ||||
| 	    "test2": { | ||||
| 	        "test": true | ||||
| 	    }, | ||||
| 	    "test3": { | ||||
| 	        "test": { | ||||
| 	            "res": "[1,2,3]" | ||||
| 	        } | ||||
| 	    } | ||||
|     } | ||||
|  | ||||
| #### Загрузка файла (метод `LoadFromFile`) | ||||
|  | ||||
| Этот метод загружает содержимое файла в класс. Он содержит **1 обязательный параметр**: | ||||
|  | ||||
| * `string $fileName` - имя файла на диске. | ||||
|  | ||||
| Метод возвращает `bool` - загружены ли данные из файла: `true` - да, `false` - нет. | ||||
|  | ||||
| Синтаксис: | ||||
|  | ||||
|     public function LoadFromFile (string $fileName): bool | ||||
|  | ||||
| **Пример:** | ||||
| Пусть дан файл `test.json`, содержимое которого представлено далее: | ||||
|  | ||||
|     { | ||||
| 	    "test": { | ||||
| 	        "subtest": { | ||||
| 	            "AAA": "123", | ||||
| 	            "BBB": 1.23 | ||||
| 	        } | ||||
| 	    }, | ||||
| 	    "test1": { | ||||
| 	        "test": 123 | ||||
| 	    }, | ||||
| 	    "test2": { | ||||
| 	        "test": true | ||||
| 	    }, | ||||
| 	    "test3": { | ||||
| 	        "test": { | ||||
| 	            "res": "[1,2,3]" | ||||
| 	        } | ||||
| 	    } | ||||
|     } | ||||
|  | ||||
| Следующий код загрузит это содержимое в класс: | ||||
|  | ||||
|     // Имя файла | ||||
|     $fileName = __DIR__ . "/test.json"; | ||||
|     // Создаём класс | ||||
|     $json = new JsonReWriter(); | ||||
|     // Загружаю данные | ||||
|     $json->LoadFromFile($fileName); | ||||
|  | ||||
| ### Чтение данных | ||||
|  | ||||
| Для чтения данных используется один общий метод `Read` и 7 его производных метода: `ReadString`, `ReadInt`, `ReadFloat`, | ||||
| `ReadBool`, `ReadArray`, `ReadObject` и `ReadSerializable`. | ||||
|  | ||||
| #### Метод `Read` | ||||
|  | ||||
| Это метод, который читает значение ключа JSON. Он имеет **1 обязательный параметр** `string $key` (ключ) и **1 | ||||
| необязательный параметр** `mixed $default` (значение по умолчанию, задан по умолчанию в `null`). | ||||
|  | ||||
| Этот метод возвращает `mixed`:  значение ключа JSON или значение по умолчанию. | ||||
|  | ||||
| Синтаксис: | ||||
|  | ||||
|     public function Read (string $key, mixed $default = null): mixed | ||||
|  | ||||
| **Пример,** | ||||
|  | ||||
|     // Создаю класс | ||||
|     $json = new JsonReWriter();   | ||||
|     // Заполняю данными | ||||
|     try { | ||||
| 	    $json->Write("test/subtest/AAA", "123"); | ||||
| 	    $json->Write("test/subtest/BBB", 1.23); | ||||
| 	    $json->Write("test1/test", 123); | ||||
| 	    $json->Write("test2/test", true); | ||||
| 	    $json->Write("test3/test/res", json_encode([1, 2, 3])); | ||||
| 	} catch (JsonException $e) { | ||||
| 		echo $e->getMessage(); | ||||
| 	} | ||||
| 	 | ||||
| 	// Получаю значение | ||||
| 	$float = (float)$json->Read("test/subtest/BBB")); | ||||
|  | ||||
| В результате, переменная `$float` будет иметь значение `1.23`. | ||||
|  | ||||
| #### Метод `ReadString` | ||||
|  | ||||
| Это метод, который читает значение ключа JSON. Он имеет **1 обязательный параметр** `string $key` (ключ) и **1 | ||||
| необязательный параметр** `string $default` (значение по умолчанию, задан по умолчанию в `""`). | ||||
|  | ||||
| Этот метод возвращает `string`:  значение ключа JSON или значение по умолчанию. | ||||
|  | ||||
| Синтаксис: | ||||
|  | ||||
|     public function ReadString (string $key, string $default = ""): string | ||||
|  | ||||
| #### Метод `ReadInt` | ||||
|  | ||||
| Это метод, который читает значение ключа JSON. Он имеет **1 обязательный параметр** `string $key` (ключ) и **1 | ||||
| необязательный параметр** `int $default` (значение по умолчанию, задан по умолчанию в `0`). | ||||
|  | ||||
| Этот метод возвращает `int`:  значение ключа JSON или значение по умолчанию. | ||||
|  | ||||
| Синтаксис: | ||||
|  | ||||
|     public function ReadInt (string $key, int $default = 0): int | ||||
|  | ||||
| #### Метод `ReadFloat` | ||||
|  | ||||
| Это метод, который читает значение ключа JSON. Он имеет **1 обязательный параметр** `string $key` (ключ) и **1 | ||||
| необязательный параметр** `float $default` (значение по умолчанию, задан по умолчанию в `0.0`). | ||||
|  | ||||
| Этот метод возвращает `float`:  значение ключа JSON или значение по умолчанию. | ||||
|  | ||||
| Синтаксис: | ||||
|  | ||||
|     public function ReadFloat (string $key, float $default = 0.0): float | ||||
|  | ||||
| #### Метод `ReadBool` | ||||
|  | ||||
| Это метод, который читает значение ключа JSON. Он имеет **1 обязательный параметр** `string $key` (ключ) и **1 | ||||
| необязательный параметр** `bool $default` (значение по умолчанию, задан по умолчанию в `false`). | ||||
|  | ||||
| Этот метод возвращает `bool`:  значение ключа JSON или значение по умолчанию. | ||||
|  | ||||
| Синтаксис: | ||||
|  | ||||
|     public function ReadBool (string $key, bool $default = false): bool | ||||
|  | ||||
| #### Метод `ReadArray` | ||||
|  | ||||
| Это метод, который читает значение ключа JSON. Он имеет **1 обязательный параметр** `string $key` (ключ) и **1 | ||||
| необязательный параметр** `array $default` (значение по умолчанию, задан по умолчанию в `[]`). | ||||
|  | ||||
| Этот метод возвращает `array`:  значение ключа JSON или значение по умолчанию. | ||||
|  | ||||
| Синтаксис: | ||||
|  | ||||
|     public function ReadArray (string $key, array $default = []): array | ||||
|  | ||||
| #### Метод `ReadObject` | ||||
|  | ||||
| Это метод, который читает значение ключа JSON. Он имеет **2 обязательных параметра**: | ||||
|  | ||||
| - `string $key` (ключ); | ||||
| - `object $default` (значение по умолчанию). | ||||
|  | ||||
| Этот метод возвращает `object`:  значение ключа JSON или значение по умолчанию. | ||||
|  | ||||
| Синтаксис: | ||||
|  | ||||
|     public function ReadObject (string $key, object $default): object | ||||
|  | ||||
| #### Метод `ReadSerializable` | ||||
|  | ||||
| Это метод, который читает значение ключа JSON. Он имеет **2 обязательных параметра**: | ||||
|  | ||||
| - `string $key` (ключ); | ||||
| - `string $serializableClassName` (имя класса, реализующего интерфейс ISerializable, с namespace). | ||||
|  | ||||
| Этот метод возвращает класс, реализующий интерфейс `ISerializable`. | ||||
|  | ||||
| **Важно!** Этот метод может выбросить исключение `JsonException`, если класс, заданный в `$serializableClassName` не | ||||
| реализует интерфейс `ISerializable`. | ||||
|  | ||||
| Синтаксис: | ||||
|  | ||||
|     public function ReadSerializable (string $key, string $serializableClassName): ISerializable | ||||
|  | ||||
| **Пример,** | ||||
|  | ||||
| Пусть для примера, класс `Demo` из namespace `iam\namespace` реализует интерфейс `ISerializable`. | ||||
|  | ||||
|     // Создаю класс | ||||
|     $json = new JsonReWriter();  | ||||
|     // ... Здесь где-то загрузка данных  | ||||
|     // Получаю класс | ||||
|     try { | ||||
| 	    /** | ||||
| 	    * @var Demo $unSerializableClass | ||||
| 	    */ | ||||
| 	    $unSerializableClass = $json->ReadSerializable("test", "iam\\namespace\\Demo"); | ||||
| 	} catch (JsonException $e) { | ||||
| 		echo $e->getMessage(); | ||||
| 	} | ||||
|  | ||||
| В результате, переменная `$unSerializableClass` будет содержать данные класса  `Demo`. | ||||
|  | ||||
| ### Запись данных | ||||
|  | ||||
| Для чтения данных используется один общий метод `Write` и 3 его производных метода: `WriteArray`, `WriteObject` и | ||||
| `WriteSerializable`. | ||||
|  | ||||
| **Важно!** Лобой из вышеуказанных методов может выбросить исключение `JsonException`, если ключ не содержит вложений, | ||||
| хотя от него требуется обратное. | ||||
|  | ||||
| #### Метод `Write` | ||||
|  | ||||
| Это метод, который записывает значение в ключ JSON. Он имеет **2 обязательных параметра**: | ||||
|  | ||||
| - `string $key` (ключ); | ||||
| - `mixed $value` (записываемое значение). | ||||
|  | ||||
| Этот метод ничего не возвращает. | ||||
|  | ||||
| Синтаксис: | ||||
|  | ||||
|     public function Write (string $key, mixed $value): void | ||||
|  | ||||
| **Пример,** | ||||
|  | ||||
|     // Имя файла | ||||
|     $fileName = __DIR__ . "/test.json"; | ||||
|     // Создаём класс | ||||
|     $json = new JsonReWriter(); | ||||
|     // Заполним данными | ||||
|     try { | ||||
| 	    $json->Write("test/subtest/AAA", "123"); | ||||
| 	    $json->Write("test/subtest/BBB", 1.23); | ||||
| 	    $json->Write("test1/test", 123); | ||||
| 	    $json->Write("test2/test", true); | ||||
| 	    $json->WriteArray("test3/test/res", [1, 2, 3]); | ||||
| 	} catch (JsonException $e) { | ||||
|     	    echo $e->getMessage(); | ||||
|     } | ||||
|     // Сохраняем созданный JSON файл | ||||
|     $json->SaveToFile($fileName); | ||||
|  | ||||
| Содержимое файла `test.json` представлено далее: | ||||
|  | ||||
|     { | ||||
| 	    "test": { | ||||
| 	        "subtest": { | ||||
| 	            "AAA": "123", | ||||
| 	            "BBB": 1.23 | ||||
| 	        } | ||||
| 	    }, | ||||
| 	    "test1": { | ||||
| 	        "test": 123 | ||||
| 	    }, | ||||
| 	    "test2": { | ||||
| 	        "test": true | ||||
| 	    }, | ||||
| 	    "test3": { | ||||
| 	        "test": { | ||||
| 	            "res": "[1,2,3]" | ||||
| 	        } | ||||
| 	    } | ||||
|     } | ||||
|  | ||||
| #### Метод `WriteArray` | ||||
|  | ||||
| Это метод, который записывает значение в ключ JSON. Он имеет **2 обязательных параметра**: | ||||
|  | ||||
| - `string $key` (ключ); | ||||
| - `array $array` (записываемое значение). | ||||
|  | ||||
| Этот метод ничего не возвращает. | ||||
|  | ||||
| Синтаксис: | ||||
|  | ||||
|     public function WriteArray (string $key, array $array): void | ||||
|  | ||||
| #### Метод `WriteObject` | ||||
|  | ||||
| Это метод, который записывает значение в ключ JSON. Он имеет **2 обязательных параметра**: | ||||
|  | ||||
| - `string $key` (ключ); | ||||
| - `object $value` (записываемое значение). | ||||
|  | ||||
| Этот метод ничего не возвращает. | ||||
|  | ||||
| Синтаксис: | ||||
|  | ||||
|     public function WriteObject (string $key, object $value): void | ||||
|  | ||||
| #### Метод `WriteSerializable` | ||||
|  | ||||
| Это метод, который записывает значение в ключ JSON. Он имеет **2 обязательных параметра**: | ||||
|  | ||||
| - `string $key` (ключ); | ||||
| - `ISerializable $serializableValue` (записываемое значение). | ||||
|  | ||||
| Этот метод ничего не возвращает. | ||||
|  | ||||
| Синтаксис: | ||||
|  | ||||
|     public function WriteSerializable (string $key, ISerializable $serializableValue): void | ||||
|  | ||||
| **Пример,** | ||||
| Пусть для примера, класс `Demo` из namespace `iam\namespace` реализует интерфейс `ISerializable`. | ||||
|  | ||||
|     // Имя файла | ||||
|     $fileName = __DIR__ . "/test.json"; | ||||
|     // Создаём класс | ||||
|     $json = new JsonReWriter(); | ||||
|     // Создаём класс Demo | ||||
|     $serializableClass = new Demo(...); | ||||
|     // Заполним данными | ||||
|     try { | ||||
| 	    $json->WriteSerializable("test", $serializableClass); | ||||
| 	} catch (JsonException $e) { | ||||
|     	    echo $e->getMessage(); | ||||
|     } | ||||
|     ... | ||||
|  | ||||
| ### Работа с ключами JSON | ||||
|  | ||||
| Для работы с ключами JSON есть 2 метода: `IsKeyExists` и `GetKeys`. | ||||
|  | ||||
| #### Метод `IsKeyExists` | ||||
|  | ||||
| Это метод проверяем наличие ключа в JSON. Он имеет **1 обязательный параметр** - `string $key` (ключ). | ||||
|  | ||||
| Этот метод возвращает `bool`:  `true` если ключ найден и `false` в противном случае. | ||||
|  | ||||
| Синтаксис: | ||||
|  | ||||
|     public function IsKeyExists (string $key): bool | ||||
|  | ||||
| **Пример,** | ||||
|  | ||||
|     // Создаём класс | ||||
|     $json = new JsonReWriter(); | ||||
|     // Заполним данными | ||||
|     try { | ||||
| 	    $json->Write("test/subtest/AAA", "123"); | ||||
| 	    $json->Write("test/subtest/BBB", 1.23); | ||||
| 	    $json->Write("test1/test", 123); | ||||
| 	    $json->Write("test2/test", true); | ||||
| 	    $json->WriteArray("test3/test/res", [1, 2, 3]); | ||||
| 	} catch (JsonException $e) { | ||||
|     	    echo $e->getMessage(); | ||||
|     } | ||||
|     // Проверяем ключи | ||||
|     $check1 = $json->IsKeyExists("test/subtest/AAA"); | ||||
|     $check2 = $json->IsKeyExists("test/subtest/ССС"); | ||||
|  | ||||
| В результате, `$check1` будет `true`, а `$check2` - `false`. | ||||
|  | ||||
| #### Метод `GetKeys` | ||||
|  | ||||
| Это метод получает список ключей. Он имеет **2 необязательных параметра**: | ||||
|  | ||||
| - `string $parentKey` (ключ родителя (или "" (установлено по умолчанию) для всех); | ||||
| - `bool $includeChildren` (нужно ли включать дочерние ключи (по умолчанию, да)). | ||||
|  | ||||
| Этот метод возвращает `array`:  список ключей. | ||||
|  | ||||
| Синтаксис: | ||||
|  | ||||
|     public function GetKeys (string $parentKey = "", bool $includeChildren = true): array | ||||
|  | ||||
| **Пример,** | ||||
|  | ||||
|     // Создаём класс | ||||
|     $json = new JsonReWriter(); | ||||
|     // Заполним данными | ||||
|     try { | ||||
| 	    $json->Write("test/subtest/AAA", "123"); | ||||
| 	    $json->Write("test/subtest/BBB", 1.23); | ||||
| 	    $json->Write("test1/test", 123); | ||||
| 	    $json->Write("test2/test", true); | ||||
| 	    $json->WriteArray("test3/test/res", [1, 2, 3]); | ||||
| 	} catch (JsonException $e) { | ||||
|     	    echo $e->getMessage(); | ||||
|     } | ||||
|     // Получаем ключи | ||||
|     $keys1 = $json->GetKeys("test"); | ||||
|     $keys2 = $json->GetKeys("test", false); | ||||
|     $keys3 = $json->GetKeys(); | ||||
|  | ||||
| В результате, `$key1` будет следующим массивом: | ||||
|  | ||||
|     [ | ||||
|     	"test/subtest", | ||||
|     	"test/subtest/AAA", | ||||
|     	"test/subtest/BBB" | ||||
|     ] | ||||
|  | ||||
| `$key2` будет следующим массивом: | ||||
|  | ||||
|     [ | ||||
|     	"subtest" | ||||
|     ] | ||||
|  | ||||
| `$key3` будет следующим массивом: | ||||
|  | ||||
|     [ | ||||
|     	"test", | ||||
|     	"test/subtest", | ||||
|     	"test/subtest/AAA", | ||||
|     	"test/subtest/BBB", | ||||
|     	"test1", | ||||
|     	"test1/test", | ||||
|     	"test2",	 | ||||
|     	"test2/test", | ||||
|     	"test3", | ||||
|     	"test3/test", | ||||
|     	"test3/test/res" | ||||
|     ] | ||||
|  | ||||
| ### Удаление ключей JSON | ||||
|  | ||||
| Для удаления ключей JSON есть 2 метода: `DeleteKey`, который удаляет только определённый ключ и `Clear`, который удаляет | ||||
| **все ключи** из json-файла. | ||||
|  | ||||
| #### Метод `DeleteKey` | ||||
|  | ||||
| Это метод удаляет только определённый ключ в JSON. Он имеет **1 обязательный параметр** - `string $key` (ключ). | ||||
|  | ||||
| Этот метод возвращает `bool` - результат удаления ключа: `true` - удаление прошло успешно, `false` - произошла ошибка | ||||
| при удалении. | ||||
|  | ||||
| Синтаксис: | ||||
|  | ||||
|     public function DeleteKey (string $key): bool | ||||
|  | ||||
| **Пример,** | ||||
|  | ||||
|     // Создаём класс | ||||
|     $json = new JsonReWriter(); | ||||
|     // Заполним данными | ||||
|     try { | ||||
| 	    $json->Write("test/subtest/AAA", "123"); | ||||
| 	    $json->Write("test/subtest/BBB", 1.23); | ||||
| 	    $json->Write("test1/test", 123); | ||||
| 	    $json->Write("test2/test", true); | ||||
| 	    $json->WriteArray("test3/test/res", [1, 2, 3]); | ||||
| 	} catch (JsonException $e) { | ||||
|     	    echo $e->getMessage(); | ||||
|     } | ||||
|     // Получаемем ключи до удаления | ||||
|     $check1 = $json->GetKeys("test/subtest"); | ||||
| 	// Удаляем ключ | ||||
| 	$this->DeleteKey("test/subtest/BBB"); | ||||
| 	// Получаемем ключи после удаления | ||||
|     $check2 = $json->GetKeys("test/subtest"); | ||||
|  | ||||
| В результате, `$check1` будет | ||||
|  | ||||
|     [ | ||||
|     	"test/subtest", | ||||
|     	"test/subtest/AAA", | ||||
|     	"test/subtest/BBB" | ||||
|     ] | ||||
|  | ||||
| а `$check2`: | ||||
|  | ||||
|     [ | ||||
|     	"test/subtest", | ||||
|     	"test/subtest/AAA" | ||||
|     ] | ||||
|  | ||||
| #### Метод `Clear` | ||||
|  | ||||
| Это метод удаляет **все ключи** из json-файла. Он не имеет никаких параметров и ничего не возвращает. | ||||
|  | ||||
| Синтаксис: | ||||
|  | ||||
|     public function Clear (): void | ||||
|  | ||||
| **Пример,** | ||||
|  | ||||
|     // Создаём класс | ||||
|     $json = new JsonReWriter(); | ||||
|     // Заполним данными | ||||
|     try { | ||||
| 	    $json->Write("test/subtest/AAA", "123"); | ||||
| 	    $json->Write("test/subtest/BBB", 1.23); | ||||
| 	    $json->Write("test1/test", 123); | ||||
| 	    $json->Write("test2/test", true); | ||||
| 	    $json->WriteArray("test3/test/res", [1, 2, 3]); | ||||
| 	} catch (JsonException $e) { | ||||
|     	    echo $e->getMessage(); | ||||
|     } | ||||
|     // Очищаем | ||||
|     $json->Clear(); | ||||
|     // Получаем ключи | ||||
|     $keys = $json->GetKeys(); | ||||
|  | ||||
| В результате, `$key` будет следующим массивом: | ||||
|  | ||||
|     [ | ||||
|     ] | ||||
| @@ -4,6 +4,9 @@ namespace goodboyalex\php_components_pack\classes; | ||||
|  | ||||
| use goodboyalex\php_components_pack\enums\JsonErrorCode; | ||||
| use goodboyalex\php_components_pack\exceptions\JsonException; | ||||
| use goodboyalex\php_components_pack\traits\JsonReWriter\JsonReWriterDeleteTrait; | ||||
| use goodboyalex\php_components_pack\traits\JsonReWriter\JsonReWriterKeyTrait; | ||||
| use goodboyalex\php_components_pack\traits\JsonReWriter\JsonReWriterLoadSaveTrait; | ||||
| use goodboyalex\php_components_pack\traits\JsonReWriter\JsonReWriterReadTrait; | ||||
| use goodboyalex\php_components_pack\traits\JsonReWriter\JsonReWriterWriteTrait; | ||||
|  | ||||
| @@ -22,6 +25,11 @@ final class JsonReWriter | ||||
|      */ | ||||
|     public string $JsonString { | ||||
|         get { | ||||
|             // Проверка на пустоту | ||||
|             if (count($this->JsonData) === 0) | ||||
|                 // - если массив пуст, возвращаем пустой JSON | ||||
|                 return '{}'; | ||||
|  | ||||
|             // Преобразую данные в JSON | ||||
|             $json = json_encode($this->JsonData, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE); | ||||
|  | ||||
| @@ -65,107 +73,18 @@ final class JsonReWriter | ||||
|         unset($this->JsonData); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Сохраняем JSON в файл. | ||||
|      * | ||||
|      * @param string $fileName Имя файла. | ||||
|      * | ||||
|      * @return bool Сохранены ли данные в файл: <code>true</code> - да, <code>false</code> - нет. | ||||
|      */ | ||||
|     public function SaveToFile (string $fileName): bool | ||||
|     { | ||||
|         // Запись данных в файл | ||||
|         return file_put_contents($fileName, $this->JsonString) !== false; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Загрузка данных из JSON-файла. | ||||
|      * | ||||
|      * @param string $fileName Имя файла. | ||||
|      * | ||||
|      * @return bool Загрузились ли данные из файла: <code>true</code> - да, <code>false</code> - нет. | ||||
|      */ | ||||
|     public function LoadFromFile (string $fileName): bool | ||||
|     { | ||||
|         // Проверка существования файла | ||||
|         if (!is_file($fileName)) | ||||
|             // - если нет, возвращаем false | ||||
|             return false; | ||||
|  | ||||
|         // Чтение содержимого файла | ||||
|         $result = file_get_contents($fileName); | ||||
|  | ||||
|         // Проверка на ошибки | ||||
|         if ($result === false) | ||||
|             // - если есть ошибки, возвращаем false | ||||
|             return false; | ||||
|  | ||||
|         // Записываем результат | ||||
|         $this->JsonString = $result; | ||||
|  | ||||
|         // Возвращаем true, если все хорошо | ||||
|         return true; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Проверяем наличие ключа в 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; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Получение ключей по вложенности. Т.е., ключи вида <code>"key1/key2/key3" => ["key1", "key2", "key3"]</code>. | ||||
|      * | ||||
|      * @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 | ||||
|     { | ||||
|  | ||||
|     } | ||||
|  | ||||
|     // Подключаем методы чтения JSON | ||||
|     use JsonReWriterReadTrait; | ||||
|  | ||||
|     // Подключаем методы записи JSON | ||||
|     use JsonReWriterWriteTrait; | ||||
|  | ||||
|     // Подключаем методы сохранения и загрузки JSON | ||||
|     use JsonReWriterLoadSaveTrait; | ||||
|  | ||||
|     // Подключаем методы работы с ключами | ||||
|     use JsonReWriterKeyTrait; | ||||
|  | ||||
|     // Подключаем методы удаления данных из JSON | ||||
|     use JsonReWriterDeleteTrait; | ||||
| } | ||||
		Reference in New Issue
	
	Block a user