@@ -414,8 +414,13 @@ class JsonValueTempl : public Json {
414414 swap (t);
415415 return *this ;
416416 }
417-
418- // / Обращение к свойству константного объекта по ключу. Не создаёт новую пару при отсутствии ключа
417+ /* !
418+ * @brief Обращение к свойству константного объекта по ключу.
419+ * @tparam T - типа ключа
420+ * @param key - ключ
421+ * @return const json_value& - ссылка на значение ключа.
422+ * Если значение не объект, или ключа нет, не создаёт новую пару, а возвращает ссылку на UNDEFINED.
423+ */
419424 template <jt::JsonKeyType<K> T>
420425 const json_value& at (T&& key) const {
421426 if (type_ == Object) {
@@ -424,14 +429,28 @@ class JsonValueTempl : public Json {
424429 }
425430 return UNDEFINED;
426431 }
427-
428- // / Обращение к свойству константного объекта по ключу. Не создаёт новую пару при отсутствии ключа
432+ /* !
433+ * @brief Обращение к свойству константного объекта по ключу.
434+ * @tparam T - типа ключа
435+ * @param key - ключ
436+ * @return const json_value& - ссылка на значение ключа.
437+ * Если значение не объект, или ключа нет, не создаёт новую пару, а возвращает ссылку на UNDEFINED.
438+ */
429439 template <jt::JsonKeyType<K> T>
430440 const json_value& operator [](T&& key) const {
431441 return at (std::forward<T>(key));
432442 }
433-
434- // / Обращение к свойству константного объекта по ключам. Не создаёт новую пару при отсутствии ключа
443+ /* !
444+ * @brief Обращение к свойству константного объекта по набору ключей.
445+ * @details Функция последовательно переходит от значения к значению по заданным ключам.
446+ * Как только указанный ключ не будет найден, перебор останавливается.
447+ * Например: config("a", "b", "c") для объекта {"a": {"b": {"c": 10}}} вернёт ссылку на 10.
448+ * @tparam T - типа ключа
449+ * @param key - ключ
450+ * @param ...args - остальные ключи
451+ * @return const json_value& - ссылка на значение ключа.
452+ * Если значение не объект, или указанного ключа нет, не создаёт новую пару, а возвращает ссылку на UNDEFINED.
453+ */
435454 template <jt::JsonKeyType<K> T, typename ...Args>
436455 const json_value& operator ()(T&& key, Args&&...args) const {
437456 const json_value& res = at (std::forward<T>(key));
@@ -441,9 +460,14 @@ class JsonValueTempl : public Json {
441460 return res.is_undefined () ? res : res (std::forward<Args>(args)...);
442461 }
443462 }
444-
445- // / Обращение к свойству объекта по ключу. Создаёт новую пару при отсутствии ключа
446- // / Если значение не объект, заменят его на объект
463+ /* !
464+ * @brief Обращение к свойству объекта по ключу.
465+ * @tparam T - тип ключа
466+ * @param key - ключ
467+ * @return json_value& - ссылку на значение ключа.
468+ * @details Если значение не json-объект, то "превращает" его в json-объект.
469+ * Если указанного ключа нет - добавляет в json-объект этот ключ с пустым значением.
470+ */
447471 template <jt::JsonKeyType<K> T>
448472 json_value& operator [](T&& key) {
449473 if (type_ != Object) {
@@ -452,9 +476,17 @@ class JsonValueTempl : public Json {
452476 }
453477 return as_object ()->try_emplace (std::forward<T>(key)).first ->second ;
454478 }
455-
456- // / Установка значения свойству объекта по ключу. Создаёт новую пару при отсутствии ключа
457- // / Если значение не объект, заменят его на объект
479+ /* !
480+ * @brief Установка значения свойству json-объекта по ключу.
481+ * @tparam Key - тип ключа
482+ * @tparam Args - типы аргументов для создания json-значения по указанному ключу
483+ * @param key - ключ
484+ * @param args - аргументы для создания json-значения по указанному ключу
485+ * @return json_value& - ссылку на json-значение по указанному ключу
486+ * @details Если значение не json-объект, то "превращает" его в json-объект.
487+ * Если указанного ключа нет - добавляет в json-объект этот ключ с заданными аргументами,
488+ * иначе присваивает ему аргументы.
489+ */
458490 template <jt::JsonKeyType<K> Key, typename ... Args>
459491 json_value& set (Key&& key, Args&& ... args) {
460492 if (type_ != Object) {
@@ -463,8 +495,7 @@ class JsonValueTempl : public Json {
463495 }
464496 return as_object ()->emplace (std::forward<Key>(key), std::forward<Args>(args)...).first ->second ;
465497 }
466-
467- // / Обращение к элементу константного массива по индексу.
498+ // / Обращение к элементу константного массива по индексу. Если это не json-массив или индекс за границами массива - возвращает ссылку на UNDEFINED.
468499 const json_value& at (size_t idx) const {
469500 if (type_ == Array) {
470501 const auto & arr = *as_array ();
@@ -474,15 +505,19 @@ class JsonValueTempl : public Json {
474505 }
475506 return UNDEFINED;
476507 }
477- // / Обращение к элементу константного массива по индексу.
508+ // / Обращение к элементу константного массива по индексу. Если это не json-массив или индекс за границами массива - возвращает ссылку на UNDEFINED.
478509 const json_value& operator [](size_t idx) const {
479510 return at (idx);
480511 }
481-
482- // / Обращение к элементу массива по индексу.
483- // / Если значение не массив - заменяется на массив.
484- // / Если индекс больше длины массива - увеличивает массив до заданного индекса
485- // / Если индекс == -1 - добавляет в массив ещё один элемент
512+ /* !
513+ * @brief Обращение к элементу массива по индексу.
514+ *
515+ * @param idx - индекс элемента
516+ * @return json_value& - ссылку на указанный элемент массива.
517+ * @details Если это значение не json-массив - "превращает" его в массив.
518+ * Если индекс == -1 - добавляет в массив ещё один элемент.
519+ * Если индекс больше длины массива - увеличивает массив до заданного индекса.
520+ */
486521 json_value& operator [](size_t idx) {
487522 if (type_ != Array) {
488523 assert (this != &UNDEFINED);
@@ -497,7 +532,7 @@ class JsonValueTempl : public Json {
497532 }
498533 return arr[idx];
499534 }
500- // / Количество элементов массива или ключей объекта
535+ // / Количество элементов json- массива или ключей json- объекта
501536 size_t size () const {
502537 if (type_ == Array) {
503538 return as_array ()->size ();
@@ -506,24 +541,51 @@ class JsonValueTempl : public Json {
506541 }
507542 return 0 ;
508543 }
509-
510- // / Слияние с другим JSON. Если replace == true, то другой JSON имеет приоритет, если он не undefined.
511- // / Если оба объекта массивы, то при append_arrays = true другой массив дописывается к этому массиву.
512- // / Если оба JSONа объекты - то сливаются по ключам.
513- // / Иначе другой JSON заменяет текущее значение.
544+ /* !
545+ * @brief Слияние с другим JSON.
546+ * @param other - другое json-значение
547+ * @param replace - заменять другим при слиянии.
548+ * @param append_arrays - при слиянии json-массивов объединять их.
549+ * @details Если replace == true, то другой JSON имеет приоритет и для простых типов, если он не undefined, он заменит текущий.
550+ * Если оба объекта json-массивы, то при append_arrays = true другой массив дописывается к этому массиву,
551+ * иначе если replace == true, то заменит текущий массив.
552+ * Если оба JSONа объекты - то сливаются по ключам. Ключи из другого объекта, которых нет в текущем - добавятся в текущий
553+ * объект. Которые есть - при replace == true будут заменены.
554+ */
514555 void merge (const json_value& other, bool replace = true , bool append_arrays = false );
515-
516- // / Распарсить текст с json.
556+ /* !
557+ * @brief Распарсить текст с json.
558+ *
559+ * @param jsonString - строка текста, которую надо распарсить.
560+ * @return std::tuple<json_value, JsonParseResult, unsigned, unsigned> - tuple, содержащую:
561+ * json_value - получившееся значение, если парсинг успешный, или UNDEFINED, в случае ошибок;
562+ * JsonParseResult - код ошибки парсинга, Success в случае успеха;
563+ * unsigned line, unsigned col - в случае ошибки это номера строки/колонки возникновения ошибки.
564+ */
517565 static std::tuple<json_value, JsonParseResult, unsigned , unsigned > parse (ssType jsonString);
518-
519- // / Сериализовать значение в lstring<K, 0>. При prettify == true - добавляет переносы строк
520- // / и отступы в указанное количество указанных символов, по умолчанию - два пробела.
521- // / При order_keys == true - сортирует ключи объектов по их имени
566+ /* !
567+ * @brief Сериализовать json-значение в строку
568+ * @param stream - строка, в которую сохранять
569+ * @param prettify - "украшать", в случае true в строке будут добавляться переносы строк и отступы.
570+ * @param order_keys - упорядочить ключи json-объектов. По стандарту порядок ключей в JSON не задаётся и не влияет
571+ * на валидность, однако часто требуется для повторяемости результатов придерживаться одного и того же
572+ * порядка вывода при разных запусках. В этом случае вывод ключей будет осуществляться упорядоченно
573+ * "побайтовым сравнением".
574+ * @param indent_symbol - при "украшении" задаёт символ для отступов, по умолчанию пробел.
575+ * @param indent_count - количество символов отступа на один уровень, по умолчанию 2.
576+ */
522577 void store (lstring<K, 0 , true >& stream, bool prettify = false , bool order_keys = false , K indent_symbol = ' ' , unsigned indent_count = 2 ) const ;
523-
524- // / Сериализовать значение в lstring<K, 0>. При prettify == true - добавляет переносы строк
525- // / и отступы в указанное количество указанных символов, по умолчанию - два пробела.
526- // / При order_keys == true - сортирует ключи объектов по их имени
578+ /* !
579+ * @brief Сериализовать json-значение в строку
580+ * @param prettify - "украшать", в случае true в строке будут добавляться переносы строк и отступы.
581+ * @param order_keys - упорядочить ключи json-объектов. По стандарту порядок ключей в JSON не задаётся и не влияет
582+ * на валидность, однако часто требуется для повторяемости результатов придерживаться одного и того же
583+ * порядка вывода при разных запусках. В этом случае вывод ключей будет осуществляться упорядоченно
584+ * "побайтовым сравнением".
585+ * @param indent_symbol - при "украшении" задаёт символ для отступов, по умолчанию пробел.
586+ * @param indent_count - количество символов отступа на один уровень, по умолчанию 2.
587+ * @return строку с JSON.
588+ */
527589 lstring<K, 0 , true > store (bool prettify = false , bool order_keys = false , K indent_symbol = ' ' , unsigned indent_count = 2 ) const {
528590 lstring<K, 0 , true > res;
529591 store (res, prettify, order_keys, indent_symbol, indent_count);
@@ -616,14 +678,19 @@ std::tuple<JsonValueTempl<K>, JsonParseResult, unsigned, unsigned> JsonValueTemp
616678 return {std::move (parser.result_ ), res, parser.line_ , parser.col_ };
617679}
618680
681+ // / Алиас для JsonValue с символами u8s
619682using JsonValue = JsonValueTempl<u8s>;
683+ // / Алиас для JsonValue с символами uws
620684using JsonValueW = JsonValueTempl<uws>;
685+ // / Алиас для JsonValue с символами u16s
621686using JsonValueU = JsonValueTempl<u16s>;
687+ // / Алиас для JsonValue с символами u32s
622688using JsonValueUU = JsonValueTempl<u32s>;
623689
624- // Один объект "пустышка"
690+ // / Один объект "пустышка"
625691template <typename K>
626692inline const JsonValueTempl<K> JsonValueTempl<K>::UNDEFINED;
693+
627694/* !
628695 * @brief Прочитать файл в строку
629696 * @param filePath
0 commit comments