PIJSON improvements and doc reference

This commit is contained in:
2022-09-28 18:08:19 +03:00
parent 2d2f6b254b
commit 44876836c5
3 changed files with 241 additions and 47 deletions

View File

@@ -26,7 +26,67 @@
//! \~english
//!
//! \~russian
//! JSON - это древовидная структура, каждый элемент которой может бить либо
//! парой имя:значение, либо массивом, либо объектом, т.е. именованным
//! списком элементов. Корневой элемент JSON может быть либо массивом,
//! либо объектом.
//!
//! Массивы заключены в квадратные скобки [], их элементы не имеют имени
//! и разделяются запятыми.
//!
//! Объекты заключены в фигурные скобки {}, их элементы имеют имя
//! и разделяются запятыми.
//!
//!
//! \~english \section PIJSON_sec1 PIJSON tree
//! \~russian \section PIJSON_sec1 Дерево PIJSON
//! \~english
//!
//! \~russian
//! %PIJSON представляет собой элемент дерева JSON. Каждый элемент имеет тип (\a type())
//! и может иметь имя (\a name()). Если это конечный элемент,то он будет иметь значение,
//! доступное через \a value(), \a toBool(), \a toInt(), \a toDouble() или \a toString().
//!
//! Если элемент преставляет собой массив, то его размер доступен через \a size(),
//! а элементы массива через целочисленный оператор []. Весь массив доступен через \a array().
//!
//! Если элемент преставляет собой объект, то его размер доступен через \a size(),
//! а элементы объекта через строковый оператор []. Проверить наличие элемента по имени можно
//! с помощью \a contains(). Весь объект доступен через \a object().
//!
//! Создать дерево из текстового представления JSON можно с помощью \a fromJSON(), а
//! преобразовать в текст с помощью \a toJSON().
//!
//!
//! \~english \section PIJSON_sec2 PIJSON creation
//! \~russian \section PIJSON_sec2 Создание PIJSON
//! \~english
//!
//! \~russian
//! Для создания нового дерева необходимо лишь создать пустой корневой PIJSON и заполнить его
//! значениями, массивами или объектами с помощью целочисленного или строкового оператора [].
//! В зависимости от типа аргумента элемент преобразуется либо в массив, либо в объект.
//!
//! При приравнивании PIJSON к какому-либо значению, его тип автоматически установится в нужный.
//! При обращении на запись целочисленным оператором [] размер массива автоматически увеличится
//! при необходимости.
//!
//!
//! \~english \section PIJSON_sec3 Mask/unmask
//! \~russian \section PIJSON_sec3 Маскирование/размаскирование
//! \~english
//!
//! \~russian
//! Строковые значения в стандарте JSON могут иметь в явном виде только печатные символы,
//! спецсимволы и юникод должны быть преобразованы маскированием, т.е., например, вместо
//! символа новой строки должно быть "\n", а не-ASCII символы должны быть в виде "\uXXXX".
//!
//! Оператор вывода в PICout не выполняет маскирования строк.
//!
//! Методы \a toJSON() и \a fromJSON() маскируют и размаскируют строковые поля.
//!
//!
PIJSON PIJSON::newObject() {
@@ -43,6 +103,38 @@ PIJSON PIJSON::newArray() {
}
PIJSON PIJSON::newString(const PIString & v) {
PIJSON ret;
ret = v;
return ret;
}
const PIVector<PIJSON> & PIJSON::array() const {
if (!isArray())
return nullEntry().c_array;
return c_array;
}
const PIMap<PIString, PIJSON> & PIJSON::object() const {
if (!isObject())
return nullEntry().c_object;
return c_object;
}
//! \details
//! \~english
//! If "v" type is boolean set type to \a PIJSON::Boolean.\n
//! If "v" type is any numeric set type to \a PIJSON::Number.\n
//! If "v" type is string set type to \a PIJSON::String.\n
//! In case of any other types set element type to \a PIJSON::Invalid.
//! \~russian
//! Если тип "v" логический, то устанавливает тип в \a PIJSON::Boolean.\n
//! Если тип "v" любой численный, то устанавливает тип в \a PIJSON::Number.\n
//! Если тип "v" строковый, то устанавливает тип в \a PIJSON::String.\n
//! Если тип "v" любой другой, то устанавливает тип в \a PIJSON::Invalid.
void PIJSON::setValue(const PIVariant & v) {
c_value = v;
switch (v.type()) {
@@ -73,9 +165,11 @@ void PIJSON::clear() {
int PIJSON::size() const {
if (!isArray())
return 0;
return c_array.size_s();
if (isArray())
return c_array.size_s();
if (isObject())
return c_object.size_s();
return 0;
}
@@ -86,8 +180,8 @@ bool PIJSON::contains(const PIString & key) const {
void PIJSON::resize(int new_size) {
c_array.resize(new_size);
c_type = Array;
c_array.resize(new_size, newString());
}
@@ -100,6 +194,8 @@ const PIJSON & PIJSON::operator[](int index) const {
PIJSON & PIJSON::operator[](int index) {
c_type = Array;
if (index >= c_array.size_s())
c_array.resize(index + 1, newString());
PIJSON & ret(c_array[index]);
return ret;
}
@@ -131,9 +227,9 @@ PIJSON & PIJSON::operator[](const PIString & key) {
}
PIString PIJSON::toJSON() const {
PIString PIJSON::toJSON(PrintType print_type) const {
PIString ret;
print(ret, *this, "", true);
print(ret, *this, "", print_type == Tree, true);
return ret;
}
@@ -294,8 +390,8 @@ PIString PIJSON::stringUnmask(const PIString & s) {
}
void PIJSON::print(PIString & s, const PIJSON & v, PIString tab, bool transform, bool comma) {
s += tab;
void PIJSON::print(PIString & s, const PIJSON & v, PIString tab, bool spaces, bool transform, bool comma) {
if (spaces) s += tab;
/*
switch (v.c_type) {
case JSONEntry::Invalid: s << "(Invalid)"; break;
@@ -307,7 +403,10 @@ void PIJSON::print(PIString & s, const PIJSON & v, PIString tab, bool transform,
case JSONEntry::Array: s << "(Array)"; break;
}
*/
if (v.name().isNotEmpty()) s += '"' + (transform ? stringMask(v.name()) : v.name()) + "\": ";
if (v.name().isNotEmpty()) {
s += '"' + (transform ? stringMask(v.name()) : v.name()) + "\":";
if (spaces) s += ' ';
}
switch (v.c_type) {
case PIJSON::Invalid: break;
case PIJSON::Null: s += "null"; break;
@@ -315,26 +414,30 @@ void PIJSON::print(PIString & s, const PIJSON & v, PIString tab, bool transform,
case PIJSON::Number: s += v.c_value.toString(); break;
case PIJSON::String: s += '"' + (transform ? stringMask(v.c_value.toString()) : v.c_value.toString()) + '"'; break;
case PIJSON::Object:
s += "{\n";
s += "{";
if (spaces) s += '\n';
{
PIString ntab = tab + " ";
auto it = v.c_object.makeIterator();
int cnt = 0;
while (it.next())
print(s, it.value(), ntab, transform, ++cnt < v.c_object.size_s());
print(s, it.value(), ntab, spaces, transform, ++cnt < v.c_object.size_s());
}
s += tab + "}";
if (spaces) s += tab;
s += "}";
break;
case PIJSON::Array:
s += "[\n";
s += "[";
if (spaces) s += '\n';
{
PIString ntab = tab + " ";
for (int i = 0; i < v.c_array.size_s(); ++i)
print(s, v.c_array[i], ntab, transform, i < v.c_array.size_s() - 1);
print(s, v.c_array[i], ntab, spaces, transform, i < v.c_array.size_s() - 1);
}
s += tab + "]";
if (spaces) s += tab;
s += "]";
break;
}
if (comma) s += ',';
s += "\n";
if (spaces) s += "\n";
}