26 KiB
Описание класса 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
.
Чтение.
- Создайте элемент класса
$json = new JsonReWriter ();
- Если у вас требуется загрузить json из файла
$fileName
, то воспользуйтесь методомLoadFromFile
:$json->LoadFromFile($fileName);
, если же json представлен строкой$jsonStr
, то загрузите её в свойство$JsonString
:$json->JsonString = $jsonStr;
- Далее можно пользоваться любым методом для чтения
Read*
, в том числе и общим$json->Read(...)
.
Пример:
// Имя файла
$fileName = __DIR__ . "/test.json";
// Создаю класс
$json = new JsonReWriter();
// Загшружаю данные из файла
$json->LoadFromFile($fileName);
// Получаю число
$float = $json->ReadFloat("test/subtest/BBB", 0.2);
В итоге в $float
будет 1.23
.
Запись.
- Создайте элемент класса
$json = new JsonReWriter ();
- Далее можно пользоваться любым методом для записи
Write*
, в том числе и общим$json->Write(...)
. - Если вам требуется создать 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
будет следующим массивом:
[
]